Подтвердить что ты не робот

Разница между Type.IsGenericTypeDefinition и Type.ContainsGenericParameters

Тип System.Type содержит свойства IsGenericTypeDefinition и ContainsGenericParameters. После прочтения документации MSDN я пришел к выводу, что оба свойства существуют для проверки того, является ли тип открытым или закрытым родовым типом.

Однако я не вижу, какая разница между этими двумя, и когда вы хотите использовать один над другим.

4b9b3361

Ответ 1

Type.ContainsGenericParameters является рекурсивным:

var genericList = typeof(List<>);
var listOfSomeUnknownTypeOfList = genericList.MakeGenericType(genericList);
listOfSomeUnknownTypeOfList.IsGenericTypeDefinition;  // => false
listOfSomeUnknownTypeOfList.ContainsGenericParameters; // => true

Что происходит, так это то, что listOfSomeUnknownTypeOfList не является общим определением типа, потому что его параметр типа известен как List<T> для некоторого T. Однако, поскольку тип listOfSomeUnknownTypeOfList не точно известен (поскольку его type - это определение типа) ContainsGenericParameters is true.

Ответ 2

ContainsGenericParameters является рекурсивной версией IsGenericTypeDefinition.

typeof(List<Func<>>).IsGenericTypeDefinition является ложным.

Ответ 3

Существует таблица под IsGenericType, которая пытается выделить некоторые отличия:

Свойство IsGenericTypeDefinition имеет значение true.

Определяет общий тип. Созданный тип создается путем вызова метода MakeGenericType для объекта Type, который представляет определение общего типа и указание массива аргументов типа.

или

Свойство ContainsGenericParameters имеет значение true.

Примеры - это общий тип, который имеет параметры неназначенного типа, тип, который вложен в определение общего типа или в открытый построенный тип, или общий тип, который имеет аргумент типа, для которого свойство ContainsGenericParameters является истинным.

Итак, они не совсем то же самое.