C#でジェネリックスを操作しているときに、奇妙な動作に困惑しました。このコードを考えてみましょう:
class CEmployee<T> { }
class CManager<T> : CEmployee<T> { }
class Program
{
static void Main(string[] args)
{
CManager<String> cemp = new CManager<String>();
Console.WriteLine(cemp.GetType());
Console.WriteLine(cemp.GetType().FullName);
Console.WriteLine(cemp.GetType().BaseType);
Console.WriteLine(cemp.GetType().BaseType.FullName);
Console.WriteLine(1);
Console.WriteLine(cemp.GetType().GetGenericTypeDefinition());
Console.WriteLine(cemp.GetType().GetGenericTypeDefinition().FullName);
Console.WriteLine(cemp.GetType().GetGenericTypeDefinition().BaseType);
Console.WriteLine(cemp.GetType().GetGenericTypeDefinition().BaseType.FullName); // Problem 1
Console.WriteLine(2);
Console.WriteLine(typeof(CManager<>));
Console.WriteLine(typeof(CManager<>).FullName);
Console.WriteLine(typeof(CManager<>).BaseType);
Console.WriteLine(typeof(CManager<>).BaseType.FullName); // Problem 1
Console.WriteLine(3);
Console.WriteLine(typeof(CManager<>).Equals(cemp.GetType().GetGenericTypeDefinition()));
Console.WriteLine(typeof(CEmployee<>).Equals(cemp.GetType().GetGenericTypeDefinition().BaseType)); // Problem 2
}
}
出力は
ConsoleApplication1.CManager`1[System.String]
ConsoleApplication1.CManager`1[[System.String, mscorlib, Version=4.0.0.0, Culture=neutr
ConsoleApplication1.CEmployee`1[System.String]
ConsoleApplication1.CEmployee`1[[System.String, mscorlib, Version=4.0.0.0, Culture=neut
1
ConsoleApplication1.CManager`1[T]
ConsoleApplication1.CManager`1
ConsoleApplication1.CEmployee`1[T]
2
ConsoleApplication1.CManager`1[T]
ConsoleApplication1.CManager`1
ConsoleApplication1.CEmployee`1[T]
3
True
False
バインドされていないジェネリック型の基本クラスが完全に使用できない理由について、私は困惑しています。
- バインドされていないジェネリック型の基本型のフルネームを取得しても何も得られないのはなぜですか?(上記のコードの「問題1」)
- CManagerインスタンスの基本型がCEmployeeであり、非バインド型CManager<>の基本クラスの型がCEmployee<>であり、非バインド型CManagerがインスタンスの汎用型定義である基本型と「等しい」場合はなぜですか非バインド型のは、インスタンスの汎用型定義の基本型と「等しくない」ですか?(上記のコードの「問題2」)