如果有超过 1 个无目的泛型类型参数(即参数的预期用途在类本身中不知道,所以你不能给他们一个更具描述性的名字)。
参见Tuple 类,作为一个很好的例子here。
Tuple有以下形式:
Tuple<T1>
Tuple<T1, T2>
Tuple<T1, T2, T3>
Tuple<T1, T2, T3, T4>
Tuple<T1, T2, T3, T4, T5>
Tuple<T1, T2, T3, T4, T5, T6>
Tuple<T1, T2, T3, T4, T5, T6, T7>
在这种情况下使用其他任何东西可能会让任何阅读您的代码的人感到困惑。看到T1、T2、T3,大家就知道它们是泛型类型参数。
但是,对于具有预定义目的的泛型参数,具体名称更合适。正如@AlexeiLevenkov 所指出的,对于返回值,使用TResult 将其与任何其他类型参数区分开来也很常见。 Func 提供了一个很好的示例,如文档here 中所述,示例如下:
public delegate TResult Func<in T, out TResult>(
T arg
)
与此类似,Dictionary 使用<TKey, TValue> 作为其类型参数。那是因为需要立即清楚哪个是哪个。类代码不知道 什么 TKey 或 TValue 是,但它确实知道它们代表键和值,因此将这些信息放入参数名称。
Microsoft 有一些(旧的!)命名准则here,其中涵盖了另一个有趣的案例。他们建议在参数本身的名称中指明放置在类型参数上的约束,如下所示:
public interface ISessionChannel<TSession> where TSession : ISession
{
TSession Session { get; }
}
在这种情况下,由于泛型参数被限制为ISession,因此通过命名参数TSession 来传达这一点是有意义的。