C# 将委托传递给构造函数不起作用
我正试图将委托作为一个参数传递给类的ctor,如下所示C# 将委托传递给构造函数不起作用,c#,C#,我正试图将委托作为一个参数传递给类的ctor,如下所示 class Foo { protected delegate void CreateResource(object parameter); protected Foo(CreateResource res) { } public Foo(string resourceName) : this(CreateStreamRes) // Compiler error { } pro
class Foo
{
protected delegate void CreateResource(object parameter);
protected Foo(CreateResource res)
{
}
public Foo(string resourceName)
: this(CreateStreamRes) // Compiler error
{
}
protected void CreateStreamRes(object o)
{
}
}
public Foo(string resourceName)
: this(CreateStreamRes) // Compiler error
{
CreateResource cr = CreateStreamRes; // OK
}
但我在注释行中得到了以下编译器错误:“非静态字段、方法或属性'CreateStreamRes(object')需要对象引用”
但是如果我像这样在构造函数中添加一个变量
class Foo
{
protected delegate void CreateResource(object parameter);
protected Foo(CreateResource res)
{
}
public Foo(string resourceName)
: this(CreateStreamRes) // Compiler error
{
}
protected void CreateStreamRes(object o)
{
}
}
public Foo(string resourceName)
: this(CreateStreamRes) // Compiler error
{
CreateResource cr = CreateStreamRes; // OK
}
它成功地编译了那一行
似乎C#将构造函数视为静态方法。因为如果我将static关键字添加到CreateStreamRes(objecto)方法中,它会编译nice
有人能解释一下为什么会发生这种情况吗?你不能在那里使用非静态方法,因为对象还没有被构造出来!只需将
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
时,对象已被分配。在构造函数内部,您可以自由使用实例方法。您不能在那里使用非静态方法,因为对象尚未构造!只需将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
时,对象已被分配。在构造函数内部,您可以自由使用实例方法。在调用:this()
关键字时,您不能调用实例方法。这是因为类的实例尚未创建。如果需要调用某个方法,则该方法必须是静态的。在调用:this()
关键字时,不能调用实例方法。这是因为类的实例尚未创建。如果您需要调用某个方法,它必须是静态的。谢谢大家。你说得对,对象还没有创建。我认为这是唯一一种在构建对象之前调用方法的情况,这就是为什么当我看到错误时我会感到震惊。谢谢你们@Daren我已经按照你们的建议进行了重构,现在可以工作了。谢谢你们。你说得对,对象还没有创建。我认为这是唯一一种在构建对象之前调用方法的情况,这就是为什么当我看到错误时我会感到震惊。谢谢@Daren,我已经按照你的建议进行了重构,现在可以正常工作了。