2

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. バインドされていないジェネリック型の基本型のフルネームを取得しても何も得られないのはなぜですか?(上記のコードの「問題1」)
  2. CManagerインスタンスの基本型がCEmployeeであり、非バインド型CManager<>の基本クラスの型がCEmployee<>であり、非バインド型CManagerがインスタンスの汎用型定義である基本型と「等しい」場合はなぜですか非バインド型のは、インスタンスの汎用型定義の基本型と「等しくない」ですか?(上記のコードの「問題2」)
4

1 に答える 1

7

逆の順序で:

2:基本タイプはCEmployee<T>、ではなく、であるためCEmployee<>。違いがあります; CEmployee<>タイプ定義です。親タイプからにCEmployee<T>バインドされます。Tあなたはこれを見てIsGenericTypeDefinitionそして見ることによってこれを見ることができますGetGenericArguments()[0]

1:FullNameこの形式のジェネリック型は定義されていないため。これは完全に文書化されています:

現在の型に特定の型に置き換えられていないジェネリック型パラメーターが含まれている(つまり、ContainsGenericParametersプロパティがtrueを返す)が、その型がジェネリック型定義ではない(つまり、IsGenericTypeDefinitionプロパティがfalseを返す)場合、このプロパティはヌル。

これはまさに「2」で説明したものです。

于 2013-03-23T08:02:54.820 に答える