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

时间:2012-05-30 14:23:54

标签: c#

我正在尝试将委托作为参数传递给类似

的类的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)
   {
   }
}

但是我在注释行中得到以下编译器错误:“非静态字段,方法或属性'CreateStreamRes(object)'”需要对象引用。

但是,如果我在构造函数中添加一个变量,就像这样

   public Foo(string resourceName)
     : this(CreateStreamRes)  // Compiler error
   {
      CreateResource cr = CreateStreamRes; // OK
   }

它成功编译了该行。

似乎C#将构造函数视为静态方法。因为如果我将 static 关键字添加到CreateStreamRes(object o)方法,它编译得很好。

有人能解释我为什么会这样吗?

2 个答案:

答案 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()关键字时无法调用实例方法。那是因为尚未创建类的实例。如果你需要调用某些方法,它必须是静态的。