为什么委托必须是静态的



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

class.... {
    private StandardBuilder _mdrResponseBuilder = 
      new StandardBuilder(MdrResponseInterpreter);
    public static bool MdrResponseInterpreter(DNMessageDeliverer builder, 
                                              DNFieldSet message)
    {
        // .... work
    }

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

因为字段初始化程序无法访问this/实例成员。如果希望访问实例成员,请将初始化移动到构造函数。

说明书上写着:

实例字段的变量初始值设定项不能引用正在创建的实例。因此,在变量初始化器中引用this是一个编译时错误

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

要添加到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;
}

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

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

不允许在初始化程序中使用实例成员。

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

最新更新