7

後で使用するために関数参照をデリゲート型に保存しようとしています。

これが私がやっていることです:

class Program
{
    static void Test()
    {

    }

    static void Main(string[] args)
    {
        Delegate t= (Delegate)Test;
    }
}

これで、次のエラーが発生します。

メソッド グループ 'Test' を非デリゲート タイプ 'System.Delegate' に変換できません。
メソッドを呼び出すつもりでしたか?

なぜこうなった?

4

2 に答える 2

8

Delegateデリゲートを格納するために型を使用するべきではありません。特定の種類のデリゲートを使用する必要があります。

ほとんどの場合、ActionorFuncをデリゲート型として使用できます。この場合、Action適切です:

class Program
{
    static void Test()
    {

    }

    static void Main(string[] args)
    {
        Action action = Test;

        action();
    }
}

Delegateこれを行うことで、技術的に のインスタンスを取得できます。

Delegate d = (Action)Test;

しかしDelegate、 などの実際の特定のタイプのデリゲートとは対照的に、実際に を使用するのActionは難しいでしょう。コンパイラはメソッドのシグネチャが何であるかを認識できなくなるため、どのパラメーターを渡す必要があるかがわからないためです。 .

于 2013-03-04T15:08:53.683 に答える
7

ここでやろうとしているのは、メソッド グループ Testを何かにキャストすることです。仕様によると、メソッド グループの唯一の有効なキャストは、デリゲート型へのキャストです。これは、次のいずれかで明示的に行うことができます。

var t = (Delegate)Test;

または暗黙的に:

Delegate t = Test;

ただし、ドキュメントに記載されているように、System.Delegateそれ自体は...デリゲート型ではありません。

Delegate クラスは、デリゲート型の基本クラスです。ただし、Delegate クラスまたは MulticastDelegate クラスから明示的に派生できるのは、システムとコンパイラだけです。また、デリゲート型から新しい型を派生させることも許可されていません。クラスはデリゲート型とは見なされませんDelegateデリゲート型を派生させるために使用されるクラスです。

コンパイラはこれを検出し、文句を言います。

メソッド グループをデリゲートにキャストする場合は、互換性のあるシグネチャ (この場合はAction) を持つデリゲート型を指定する必要があります。

于 2013-03-04T15:09:52.683 に答える