In your example List<T>
is a generic type definition. T
is called a generic type parameter. When the type parameter is specified like in List<string>
or List<int>
or List<double>
then you have a generic type. You can see that by running some code like this...
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);
}
Which will print
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.
Another way to get the generic type definition directly is typeof(List<>)
or typeof(Dictionary<,>)
.