はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【C#】オープンジェネリック型(Open Generic Types)とクローズジェネリック型(Closed Generic Types)の違いについて

はじめに

今回はオープンジェネリック型(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());