在通用类型(Generic type)或方法定义中,类型(type)参数是客户端在创建通用类型的实例时指定的特定类型的占位符(placeholder),泛型类(例如,泛型简介中给出的(GenericList<T>)不能按照原样使用,因为它实际上不是类型。它更像是一种类型的蓝图。要使用GenericList<T>客户端代码必须通过在尖括号内指定类型实参来声明并实例化构造的类型。此特定类型的类型参数可以是编译器可以识别的任何类型。可以创建任意数量的构造类型实例,每个实例使用不同的类型参数如下所示:
GenericList<float> list1 = new GenericList<float>(); GenericList<ExampleClass> list2 = new GenericList<ExampleClass>(); GenericList<ExampleStruct> list3 = new GenericList<ExampleStruct>();
在GenericList<T>的所有这些实例中,类中每次出现的T都在运行时用type参数替换。通过这种替换,我们使用单个类定义创建了三个单独的类型安全和有效的对象。有关CLR如何执行此替换的更多信息,请参见运行中的泛型
类型参数命名准则:
1、用描述性名称来命名通用类型参数,除非单个字母名称完全可以自我解释,并且描述性名称不会增加价值。
public interface ISessionChannel<TSession> { /*...*/ } public delegate TOutput Converter<TInput, TOutput>(TInput from); public class List<T> { /*...*/ }
2、对于具有一个字母类型参数的类型,请考虑使用T作为类型参数名称。
public int IComparer<T>() { return 0; } public delegate bool Predicate<T>(T item); public struct Nullable<T> where T : struct { /*...*/ }
3、在描述性类型参数名称前添加T作为前缀
public interface ISessionChannel<TSession> { TSession Session { get; } }
4、考虑以参数名称指示放置在类型参数上的约束。例如,约束到ISession的参数可以成为TSession