5

Concreteがから派生する次のコード サンプルを検討してくださいBase

class Base{}
class Concrete : Base {}

static void Foo<T>() where T : Base
{
    if (typeof(Concrete).IsAssignableFrom(typeof(T)))
    {
        var x = new Bar<T>(); // compile error on this line
    }
}

class Bar<T> where T : Concrete
{
}

コンパイル エラーが発生している行では、ジェネリック引数が型に割り当て可能であることを既に確認していますConcrete。したがって、理論的には、Bar クラスのインスタンスを作成する方法があるはずです。

コンパイルエラーを取り除く方法はありますか? 議論を投げかける方法が思い浮かびません。


コンパイル エラーの全文:

エラー 14 型 'T' は、ジェネリック型またはメソッド 'Bar' の型パラメーター 'T' として使用できません。'T' から 'Concrete' への暗黙的な参照変換はありません。

4

1 に答える 1

5

コンパイラは、現在 Base に制約されている T が実際に Concrete であることを知る方法がなく、以前にテストしたとしてもそれを知る方法がありません。

そう:

Type type = typeof(Bar<>);
Type generic = type.MakeGenericType(typeof(T));
var x = Activator.CreateInstance(generic); 

それをする機会を与えないでください。

于 2012-11-06T15:03:56.147 に答える