2012-03-28 57 views
8

在下面的代码中,我必须声明方法MdrResponseInterpreterstatic否则我有编译错误。为什么委托必须是静态的?

class.... { 

    private StandardBuilder _mdrResponseBuilder = 
     new StandardBuilder(MdrResponseInterpreter); 

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

为什么?由于_mdrResponseBuilder也不是一成不变的我希望MdrResponseInterpreter应该能够访问this

回答

11

因为字段初始化没有获得this /实例成员。如果您想访问实例成员,请将初始化移至构造函数。

的规范说:

为实例字段变量初始值不能引用被创建的实例。因此,它是引用this在变量初始值

虽然您的代码不明确引用this一个编译时间错误,委托转换的方法组不引用this隐含如果方法是一个实例成员。

1

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

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

+1

这里肯定有*是一个对象(否则这个值在哪里被赋值?),但是你不允许访问'this'。 – 2012-03-28 09:21:25

+0

当然,我不清楚。更新了我的答案。 – Botz3000 2012-03-28 09:24:10

+0

我仍然认为它不清楚。对象*确实存在,完全。它可能没有完全初始化,但在构造函数体中也是如此。 (可能还有其他派生的构造函数体,它们还没有运行,...) – 2012-03-28 09:25:05

1

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

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),但仍然在构造函数中使用它。

+0

@Downvoter:小心点评? – 2012-03-28 09:28:02

+0

只是想知道,这是如何“_mdrResponsBuilder = MdrResponseInterpreter”是正确的?问题中没有任何内容表明StandardBuilder是一个委托...它可能是一个在其构造函数中接受Func 的类?顺便说一句,我没有downvote – odalet 2012-03-28 09:56:47

+1

@odalet:是的,这是可能的。我认为它更可能(给出问题标题)它是一个委托类型。将编辑澄清。 – 2012-03-28 09:58:50

相关问题