Язык C # определяет открытый тип как тип, который является либо аргументом типа, либо универсальным типом, определенным с аргументами неизвестного типа:
Все типы можно разделить на открытые или закрытые. Открытый тип - это тип, который включает параметры типа. Более конкретно:
- Параметр типа определяет открытый тип.
- Тип массива является открытым типом тогда и только тогда, когда его тип элемента является открытым типом.
- Сконструированный тип является открытым типом тогда и только тогда, когда один или несколько его аргументов типа являются открытым типом. Сконструированный вложенный тип является открытым типом тогда и только тогда, когда один или несколько его аргументов типа или аргументы типа содержащего его типа (ов) являются открытым типом.
закрытый тип - это тип, который не является открытым типом.
Следовательно, T
, List<T>
, Dictionary<string,T>
и Dictionary<T,U>
- все открытые типы (T
и U
- аргументы типа), тогда как List<int>
и Dictionary<string,int>
- закрытые типы.
Существует связанная концепция: несвязанный универсальный тип - это универсальный тип с неопределенными аргументами типа. Несвязанный тип нельзя использовать в выражениях, отличных от typeof()
, и вы не можете создать его экземпляр или вызвать его методы. Например, List<>
и Dictionary<,>
- несвязанные типы.
Чтобы прояснить тонкое различие между открытым типом и несвязанным типом:
class Program {
static void Main() { Test<int>(); }
static void Test<T>() {
Console.WriteLine(typeof(List<T>)); // Print out the type name
}
}
Если вы запустите этот фрагмент, он распечатает
System.Collections.Generic.List`1[System.Int32]
которое является именем CLR для List<int>
. Во время выполнения ясно, что аргумент типа System.Int32
. Это делает List<T>
связанным открытым типом.
Во время выполнения вы можете использовать отражение для привязки аргументов типа к неопределенным параметрам типа несвязанных универсальных типов с помощью _ 17_ метод:
Type unboundGenericList = typeof(List<>);
Type listOfInt = unboundGenericList.MakeGenericType(typeof(int));
if (listOfInt == typeof(List<int>))
Console.WriteLine("Constructed a List<int> type.");
Вы можете проверить, является ли тип несвязанным универсальным типом (определение универсального типа), из которого вы можете создавать связанные типы с помощью _ 19_ свойство:
Console.WriteLine(typeof(Dictionary<,>).IsGenericTypeDefinition); // True
Console.WriteLine(typeof(Dictionary<int,int>).IsGenericTypeDefinition); // False
Чтобы получить несвязанный тип из сконструированного типа во время выполнения, вы можете использовать Type.GetGenericTypeDefinition
метод.
Type listOfInt = typeof(List<int>);
Type list = listOfInt.GetGenericTypeDefinition(); // == typeof(List<>)
Обратите внимание, что для универсального типа вы можете иметь либо полностью несвязанное определение типа, либо полностью связанное определение. Вы не можете связать одни параметры типа и оставить другие несвязанными. Например, у вас не может быть Dictionary<int,>
или Dictionary<,string>
.
person
mmx
schedule
31.01.2010