泛型类型参数命名遵循行业惯例:单参数用T(Type),键值对用K/V,集合元素用E(Element),异常用TException避免歧义,多参数可加前缀如TKey、TValue,首字母大写且为合法标识符。

泛型类型参数命名不是随便起个名字就行,它有明确的行业惯例和实用逻辑——核心是用最简短的字母,清晰表达该参数在上下文中的角色。
通用类型参数用 T
单个大写字母 T 是最基础、最常用的占位符,代表 “Type”。它适用于任何不特指语义的泛型场景:
-
List<T>、Stack<T>、Func<T, bool> - 如果只有一个类型参数,优先选 T,而不是
ItemType或DataType这类冗长写法 - 命名不追求“完整”,而追求“一致”和“可预期”——看到
T就知道这是主操作类型
键值对场景用 K 和 V
当泛型结构天然成对出现(如字典、映射),约定用 K 表示 Key 类型,V 表示 Value 类型:
-
Dictionary<K, V>、KeyValuePair<K, V> - 这两个字母紧挨着用,顺序固定:先 K 后 V,不能颠倒
- 即使 Key 是
int、Value 是string,也依然写作Dictionary<int, string>,而非Dictionary<TKey, TValue>——后者仅在需要更明确语义时才展开
集合元素用 E,异常用 E(需靠上下文区分)
E 常见于两类场景,靠命名位置或文档辅助区分:
- 作为集合元素类型:
Queue<E>、HashSet<E>,此时 E = Element - 作为异常类型参数:
TryCatch<T, E>,此时 E = Exception(较少见,建议显式写为TException避免歧义) - 若一个泛型同时涉及元素和异常,应避免都用 E,改用
TElement和TException等带前缀形式
其他常用缩写与使用原则
还有几个高频缩写,按需选用,但不强行堆砌:
-
N:数值类型,如
Range<N>(表示数字区间) -
S:子类型(Subtype),多用于继承约束场景,如
Converter<T, S>中 S 是 T 的派生类型 - 多个参数时,可组合使用前缀:如
TKey、TValue、TResult、TInput——适用于 API 公开程度高、需强可读性的场合 - 所有类型参数名必须是合法标识符,不能含数字开头、空格或特殊符号;首字母大写,不加下划线


















