0

このようなクラスのコンストラクターのパラメーターとしてデリゲートを渡そうとしています

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#はコンストラクターを静的メソッドとして扱っているようです。なぜなら、静的キーワードを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 に答える