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

C# 为什么委托必须是静态的?,c#,delegates,initializer,method-group,C#,Delegates,Initializer,Method Group,在下面的代码中,我必须声明方法MdrResponseInterpreterstatic,否则我有编译错误 class.... { private StandardBuilder _mdrResponseBuilder = new StandardBuilder(MdrResponseInterpreter); public static bool MdrResponseInterpreter(DNMessageDeliverer builder,

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

class.... {

    private StandardBuilder _mdrResponseBuilder = 
      new StandardBuilder(MdrResponseInterpreter);

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

为什么??由于
\u mdrResponseBuilder
不是静态的,因此我希望
MdrResponseInterpreter
应该能够访问
,因为字段初始值设定项无权访问
/实例成员。如果希望访问实例成员,请将初始化移动到构造函数

说明书上说:

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


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

不允许在初始值设定项中使用实例成员


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

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

要添加到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
是委托类型。如果它是一个构造函数接受委托类型的类型,那么您需要返回到
newstandartbuilder(MdrResponseInterpreter)
,但它仍然在构造函数中。

在该点上肯定有一个对象(否则赋值在哪里?)但是你还不允许访问
这个
。我还是说不清楚。该对象确实存在,完全不存在。它可能尚未完全初始化,但在构造函数体中也是如此。(可能还有其他派生构造函数体尚未运行…)只是想知道,“mdrResponsBuilder=MdrResponseInterpreter”怎么正确?问题中没有任何内容表明StandardBuilder是一名代表。。。它可能是一个在构造函数中接受Func的类?顺便说一句,我没有downvote@odalet:是的,那是可能的。我认为它更有可能(给出问题标题)是一种委托类型。将编辑以澄清。