0

我正在尝试将委托作为参数传递给这样的类的 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) 方法,它编译得很好。

有人可以解释一下为什么会这样吗?

4

2 回答 2

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,该对象已被分配。构造函数内部,您可以自由使用实例方法。

于 2012-05-30T14:26:06.997 回答
3

:this()调用关键字时不能调用实例方法。那是因为尚未创建该类的实例。如果您需要在那里调用某些方法,则它必须是静态的。

于 2012-05-30T14:26:39.837 回答