在下面的代码中,我必须声明方法MdrResponseInterpreter
static
否则我有编译错误。
class.... {
private StandardBuilder _mdrResponseBuilder =
new StandardBuilder(MdrResponseInterpreter);
public static bool MdrResponseInterpreter(DNMessageDeliverer builder,
DNFieldSet message)
{
// .... work
}
为什么呢?由于_mdrResponseBuilder
不是静态的,我希望MdrResponseInterpreter
应该能够访问this
答案 0 :(得分:11)
因为字段初始值设定项无法访问this
/实例成员。如果要访问实例成员,请将初始化移动到构造函数。
规范说:
实例字段的变量初始值设定项无法引用正在创建的实例。因此,在变量初始化程序
中引用this
是编译时错误
虽然您的代码未明确引用this
,但如果方法是实例成员,则委托转换的方法组会隐式引用this
。
答案 1 :(得分: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)
,但仍然在构造函数中有它。
答案 2 :(得分:1)
您不能在初始值设定项中使用实例成员。
将委托视为具有1)对象引用和2)方法引用。由于您无法访问this
,因此无法设置对象引用,因此将该方法用作委托的唯一方法是将其声明为static
(因为委托的对象引用静态方法是null
。将初始化移动到构造函数可以帮助您解决这个问题。
答案 3 :(得分:1)
该方法必须是静态的,因为它是在构造函数开始执行之前在对象初始化时调用的。如果要访问this
,请从构造函数内部调用初始化方法。