8

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

class.... {

    private StandardBuilder _mdrResponseBuilder = 
      new StandardBuilder(MdrResponseInterpreter);

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

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

4

4 回答 4

11

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

规范说:

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

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

于 2012-03-28T09:19:23.383 回答
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),但仍然在构造函数中具有它。

于 2012-03-28T09:20:47.547 回答
1

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

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

于 2012-03-28T09:20:14.780 回答
1

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

于 2012-03-28T09:20:45.437 回答