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

时间:2012-03-28 09:17:01

标签: c# delegates initializer method-group

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

class.... {

    private StandardBuilder _mdrResponseBuilder = 
      new StandardBuilder(MdrResponseInterpreter);

    public static bool MdrResponseInterpreter(DNMessageDeliverer builder, 
                                              DNFieldSet message)
    {
        // .... work
    }

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

4 个答案:

答案 0 :(得分:11)

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

规范说:

  

实例字段的变量初始值设定项无法引用正在创建的实例。因此,在变量初始化程序

中引用this是编译时错误

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

答案 1 :(得分: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;
}

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

答案 2 :(得分:1)

您不能在初始值设定项中使用实例成员。

将委托视为具有1)对象引用和2)方法引用。由于您无法访问this,因此无法设置对象引用,因此将该方法用作委托的唯一方法是将其声明为static(因为委托的对象引用静态方法是null。将初始化移动到构造函数可以帮助您解决这个问题。

答案 3 :(得分:1)

该方法必须是静态的,因为它是在构造函数开始执行之前在对象初始化时调用的。如果要访问this,请从构造函数内部调用初始化方法。