В чем разница между универсальным типом и определением универсального типа? - PullRequest
20 голосов
/ 02 апреля 2010

Я изучаю .net отражение и с трудом выясняю разницу.

Насколько я понимаю, List<T> - это определение общего типа. Означает ли это, что для .net отражение T является универсальным типом?

В частности, я думаю, что я ищу дополнительные сведения о функциях Type.IsGenericType и Type.IsGenericTypeDefinition.

Спасибо!

Ответы [ 2 ]

29 голосов
/ 02 апреля 2010

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

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(Dictionary<,>).

1 голос
/ 02 апреля 2010

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

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<T>. Второй тест не пройден, потому что List<string> отличается от List<int>. Определение универсального типа сравнивает исходный универсальный до определения T.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...