C# 将委托传递给构造函数不起作用

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

我正试图将委托作为一个参数传递给类的ctor,如下所示

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,我已经按照你的建议进行了重构,现在可以正常工作了。