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:是的,那是可能的。我认为它更有可能(给出问题标题)是一种委托类型。将编辑以澄清。