为什么委托必须是静态的?

jav*_*red 8 c# delegates initializer method-group

在下面的代码中,我必须声明方法,MdrResponseInterpreter static否则我有编译错误.

class.... {

    private StandardBuilder _mdrResponseBuilder = 
      new StandardBuilder(MdrResponseInterpreter);

    public static bool MdrResponseInterpreter(DNMessageDeliverer builder, 
                                              DNFieldSet message)
    {
        // .... work
    }
Run Code Online (Sandbox Code Playgroud)

为什么?由于_mdrResponseBuilder不是静态的,我希望MdrResponseInterpreter应该能够访问this

Cod*_*aos 11

因为字段初始值设定项无权访问this/实例成员.如果要访问实例成员,请将初始化移动到构造函数.

规范说:

实例字段的变量初始值设定项无法引用正在创建的实例.因此,this在变量初始化程序中引用是编译时错误

虽然您的代码没有显式引用this,但是this如果方法是实例成员,则委托转换的方法组会隐式引用.


Jon*_*eet 5

要添加到CodeInChaos的答案(这是正确的),您只需将赋值移动到构造函数:

private StandartBuilder _mdrResponsBuilder;

public Foo() // Whatever your type is called
{
    // Simpler syntax for creating a delegate, too. Just use a
    // method group conversion...
    _mdrResponsBuilder = MdrResponseInterpreter;
}
Run Code Online (Sandbox Code Playgroud)

编辑:以上假定这StandartBuilder是一个委托类型.如果它是一个构造函数接受委托类型的类型,那么你需要返回new StandartBuilder(MdrResponseInterpreter),但仍然在构造函数中.