2

typeof(SomeGenericType<>具体的なパラメータを指定せずに、C# 言語で ) が必要であることを誰かが説明してくれませんか。

次の例をまとめました。

        var t1 = typeof(Nullable<>);
        var t2 = typeof(Nullable<int>);
        var q = 1 as int?;

        var b1 = t1.IsInstanceOfType(q); //false
        var b2 = t2.IsInstanceOfType(q); //true

私が最初に考えたのは、ジェネリック パラメータ を指定するtypeof(Nullable<>)よりも「よりジェネリック」ですが、そうであることが判明した ため、 のインスタンスは のインスタンスではありません。t2intb1falseint?Nullable<>

では、変数をどのように定義すればb1よいのtrueでしょうか? どのような実用的な用途がありますか?

4

2 に答える 2

4

それはオープンジェネリック型です。
これは実際の型ではありません。そのタイプのインスタンスを持つことはできません。

代わりに、 などの具象 (クローズド) ジェネリック型を生成するために使用できますNullable<int>

メソッドをチェックすることで、クローズ ジェネリック型が特定のオープン ジェネリック型のインスタンスであるかどうかをチェックすることもできますGetGenericTypeDefinition()

于 2012-11-01T17:15:56.780 に答える
4

では、b1 が true になるように変数を定義するにはどうすればよいでしょうか?

できません。(実際には、Nullable<T>とにかく興味深いボクシングの問題に出くわすことになりますが、そこに行きます...)

実行時には、値は常に閉じた型のインスタンスです。Nullable<>オープンジェネリック型ですList<>。そのような型を呼び出すことは決して役に立ちません。かといって、駄目というわけではありません。IsInstanceOfType

通常、オープン型はリフレクションで使用されます。例えば:

public IList CreateList(Type elementType)
{
    Type closedType = typeof(List<>).MakeGenericType(elementType);
    return (IList) Activator.CreateInstance(closedType);
}

汎用的なコードが上位にある可能性がありますが代わりに値を渡す下位レベルを呼び出します。Typeその後、リストをスタックに戻して、IEnumerable<T>の適切な値にキャストすることができますT

同様に、リフレクションを使用してクローズド タイプを作成し、メソッドを呼び出すこともできます。

これを使用して、特定の型が何らかの型引数のジェネリック インターフェイスを実装しているかどうかを確認することできます。実装されているインターフェイスごとに、それがジェネリックかどうかを確認し、ジェネリック型定義を取得して、それが (say) と等しいかどうかを確認できます。IEnumerable<>

于 2012-11-01T17:17:49.837 に答える