3

派生クラスのジェネリックメソッドをオーバーライドできないと思いました。

http://my.safaribooksonline.com/book/programming/csharp/9780071741163/generics/ch18lev1sec13

このリンクのコードは正常に実行されます。オーバーライドされたメソッドが呼び出されますが、のインスタンスタイプは

派生型のインスタンスではなく、基本クラスが使用されます。

私の以前の質問タイプパラメータ宣言はタイプではなく識別子でなければならないので、今私は混乱しています

動作しなかった基本型のインスタンスでオーバーライドするジェネリックメソッドを呼び出すことです!

4

2 に答える 2

1

問題は、メソッドのシグネチャと宣言に関する単純な混乱です。リンクされたコードは、return Tのメソッドシグネチャをオーバーライドしています。returnTのパラメーターはなく、パラメーターはありません。メソッドのシグネチャは同じであるため、これはまったく問題ありません。

Document<T, U>リンクされた質問は、 withの戻り値をオーバーライドしようとしますDocument<type1, type2>。これは、一般的な角かっこで型が許可されていないため、それ自体は無効ですが、オーバーライドによってメソッドのシグネチャが変更されるため無効です。

于 2012-08-28T22:01:27.977 に答える
0

メソッドを宣言するときは、型パラメーターを使用する必要があります。メソッドを呼び出すときは、一般的にプログラミングしているかどうかに応じて、型パラメーターまたは型のいずれかを使用します。

有効な宣言:

void DoSomething<T>(T input)
{
 ...
}

無効な宣言:

void DoSomething<int>(T input)
{
 ...
}

有効な呼び出し:

DoSomething<int>(input);

有効な呼び出し(Sこのスコープで以前に定義された型パラメーターの場合):

DoSomething<S>(input);

有効な呼び出し(型パラメーターTは引数から推測できるためinput):

DoSomething(input);
于 2012-08-28T21:36:30.020 に答える