4

コンパイラが重複していると不平を言っていることを定義しようとしている2つの汎用デリゲートがありますが、私の目には完全に異なっています。私は何をしていますか/間違っていますか?

delegate TReturn foo<TParameter, out TReturn>(TParameter parameter, IItem item);

delegate TReturn foo<TParameter, out TReturn>(TParameter parameter, int field, IItem item);

2 番目のデリゲートに新しいジェネリック パラメーターを追加すると、すべてが機能します。

delegate TReturn foo<TParameter, TField, out TReturn>(TParameter parameter, TField field, IItem item) where TField struct

しかし、それは正しくないようです。フィールドには常にintを渡します-ジェネリックであってはなりません。

4

2 に答える 2

5

デリゲートはメソッドではありません。メソッドを呼び出す方法は知っていますが、それ自体はメソッドではない (デリゲートは ですobject) ため、メソッドのようにオーバーロードすることはできません。

なぜそれが不可能なのかについては、この投稿を参照してください。

于 2012-07-02T16:01:17.027 に答える
3

キーワードを使用する場合delegate、舞台裏で行われるのは、コンパイラがその定義に基づいてクラスを生成することです。したがって、次のようにデリゲートを定義すると、次のようになります。

delegate TReturn foo<TParameter, out TReturn>(TParameter parameter, IItem item);

それから次のクラスが生成されます。

class foo<TParameter, out TReturn> : MulticastDelegate
{
    public void Invoke(TParameter parameter, IItem item) { ... }
    ....
}

ご覧のとおり、同じ名前で同じ汎用パラメーターを持つ2つのデリゲートがある場合、2つの同一のクラスが生成されますが、これはもちろん受け入れられません。

私は、ジェフリー・リッチターのC#を介した優れた本CLRをお勧めします。この本は、このような舞台裏のものにさらに光を当てます。

于 2012-07-02T16:04:08.773 に答える