Каково различие между универсальным типом и универсальным определением типа?

Я Учусь на отражении .NET и нелегко выяснять различие.

Из того, что я понимаю, List<T> универсальное определение типа. Это означает, что к отражению .NET T является универсальным типом?

А именно, я предполагаю, что ищу больше фона на Типе. IsGenericType и Тип. Функции IsGenericTypeDefinition.

Спасибо!

20
задан Jason Punyon 2 April 2010 в 02:58
поделиться

2 ответа

В вашем примере List является определением универсального типа. T называется параметром универсального типа. Если параметр типа указан как в List или List или List , тогда у вас есть общий тип. Вы можете увидеть это, запустив какой-нибудь код вроде этого ...

public static void Main()
{
    var l = new List<string>();
    PrintTypeInformation(l.GetType());
    PrintTypeInformation(l.GetType().GetGenericTypeDefinition());
}

public static void PrintTypeInformation(Type t)
{
    Console.WriteLine(t);
    Console.WriteLine(t.IsGenericType);
    Console.WriteLine(t.IsGenericTypeDefinition);    
}

Который напечатает

System.Collections.Generic.List`1[System.String] //The Generic Type.
True //This is a generic type.
False //But it isn't a generic type definition because the type parameter is specified
System.Collections.Generic.List`1[T] //The Generic Type definition.
True //This is a generic type too.                               
True //And it's also a generic type definition.

Другой способ получить определение универсального типа напрямую - это typeof (List <>) или typeof ( Словарь <,>) .

29
ответ дан 30 November 2019 в 00:35
поделиться

Это поможет объяснить это, возможно:

List<string> lstString = new List<string>();
List<int> lstInt = new List<int>();

if (lstString.GetType().GetGenericTypeDefinition() ==
    lstInt.GetType().GetGenericTypeDefinition())
{
    Console.WriteLine("Same type definition.");
}

if (lstString.GetType() == lstInt.GetType())
{
    Console.WriteLine("Same type.");
}

Если вы запустите его, вы получите первый успешный тест, потому что оба элемента реализуют тип Список . Второй тест не выполняется, поскольку List не совпадает с List . Определение универсального типа сравнивает исходный универсальный до определения T .

Тип IsGenericType просто проверяет, определен ли общий T . IsGenericTypeDefinition проверяет, что общий T НЕ был определен. Это полезно, если вы хотите узнать, определены ли два объекта из одного и того же базового универсального типа, например, в первом примере List .

1
ответ дан 30 November 2019 в 00:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: