我正在尝试将委托作为参数传递给类似
的类的ctorclass Foo
{
protected delegate void CreateResource(object parameter);
protected Foo(CreateResource res)
{
}
public Foo(string resourceName)
: this(CreateStreamRes) // Compiler error
{
}
protected void CreateStreamRes(object o)
{
}
}
但是我在注释行中得到以下编译器错误:“非静态字段,方法或属性'CreateStreamRes(object)'”需要对象引用。
但是,如果我在构造函数中添加一个变量,就像这样
public Foo(string resourceName)
: this(CreateStreamRes) // Compiler error
{
CreateResource cr = CreateStreamRes; // OK
}
它成功编译了该行。
似乎C#将构造函数视为静态方法。因为如果我将 static 关键字添加到CreateStreamRes(object o)方法,它编译得很好。
有人能解释我为什么会这样吗?
答案 0 :(得分:3)
你不能在那里使用非静态方法,因为该对象尚未构建!只需将CreateStreamRes
定义为静态即可完成!
现在,我确信Eric Lippert可以给你一个正确的解释,为什么会出现这种情况,但我认为这样:使用:this()
语法将转换为调用构造函数首先然后做构造函数体中的任何事情。所以你不能在一个尚不存在的对象上使用实例方法,对吗?
你可以将构造函数的部分主体分解出来并调用:
class Foo
{
protected delegate void CreateResource(object parameter);
protected Foo(CreateResource res)
{
Initialize(res);
}
protected void Initialize(CreateResource res)
{
}
public Foo(string resourceName)
{
Initialize(CreateStreamRes(res));
}
protected void CreateStreamRes(object o)
{
}
}
这样可行,因为在您调用Initialize
时,该对象已被分配。 Inside 构造函数,您可以自由使用实例方法。
答案 1 :(得分:3)
调用:this()
关键字时无法调用实例方法。那是因为尚未创建类的实例。如果你需要调用某些方法,它必须是静态的。