はじめに
今回はオープンジェネリック型(Open Generic Types)とクローズジェネリック型(Closed Generic Types)について取り上げたいと思います。
概要
- オープンジェネリック型(
Open Generic Types
):型パラメーターに具体的な型を定めていないジェネリック - クローズジェネリック型(
Closed Generic Types
):型パラメーターに具体的な型を定めたジェネリック
インスタンス化できるのがクローズジェネリク型で、できないのがオープンジェネリック型と考えても良いかもしれません。
オープンジェネリック型
// ------------------- // オープンジェネリック型 // ------------------- var open1 = typeof(List<>); var open2 = typeof(Dictionary<,>); // System.Collections.Generic.List`1[T] Console.WriteLine(open1); // System.Collections.Generic.Dictionary`2[TKey,TValue] Console.WriteLine(open2); // True : オープンジェネリック型かどうか Console.WriteLine(open1.IsGenericTypeDefinition); Console.WriteLine(open2.IsGenericTypeDefinition); // System.Collections.Generic.List`1[T] Console.WriteLine(open1.GetGenericTypeDefinition()); // System.Collections.Generic.Dictionary`2[TKey,TValue] Console.WriteLine(open2.GetGenericTypeDefinition());
クローズジェネリック型
// ------------------- // クローズジェネリック型 // ------------------- var closed1 = typeof(List<int>); var closed2 = typeof(Dictionary<int,int>); // System.Collections.Generic.List`1[System.Int32] Console.WriteLine(closed1); // System.Collections.Generic.Dictionary`2[System.Int32,System.Int32] Console.WriteLine(closed2); // False : オープンジェネリック型かどうか Console.WriteLine(closed1.IsGenericTypeDefinition); Console.WriteLine(closed2.IsGenericTypeDefinition); // System.Collections.Generic.List`1[T] Console.WriteLine(closed1.GetGenericTypeDefinition()); // System.Collections.Generic.Dictionary`2[TKey,TValue] Console.WriteLine(closed2.GetGenericTypeDefinition());