6

私は次のクラスを持っています

public class A<T>
{
}
public class B<T> : A<T>
{
}
public class C1 : B<string>
{
}
public class C2 : B<int>
{
}

私がやりたいのは、から派生した任意のクラスをパラメータとして、またはパラメータとして取ることができるメソッドを持つB<T>ことC1ですC2。しかし、メソッドを次のように宣言する

public void MyMethod(B<T> x)

動作しません。コンパイラ エラーが発生します。

エラー CS0246: 型または名前空間名 'T' が見つかりませんでした。using ディレクティブまたはアセンブリ参照がありませんか? (CS0246)

私はここでかなり立ち往生しています。非ジェネリックな基本クラスを作成してB<T>も機能しませんA<T>。その方法から派生させることはできないからです。私が考えることができる唯一の(醜い)解決策は、によって「実装」される空のダミーインターフェースを定義することB<T>です。もっとエレガントな方法はありますか?

4

3 に答える 3

10

一般的な方法を使用します。

public void MyMethod<T> (B<T> x)

そして、次のように呼び出すことができます:

MyMethod(new B<string>());
MyMethod(new C1());
MyMethod(new C2());
于 2012-09-19T12:40:55.867 に答える
4

Tメソッドで指定します。

public void MyMethod<T>(B<T> x)

または、おそらくメソッドを含むクラスで:

public class Foo<T>
{
    public void MyMethod(B<T> x){}
}

どちらの場合も、元のクラスで指定された同じ型制約 (存在する場合) が必要です。

于 2012-09-19T12:41:04.937 に答える
3

メソッドのシグネチャを次のように変更します。

public void MyMethod<T>(B<T> x)
于 2012-09-19T12:41:42.123 に答える