sta*_*ica 5 c# generics iequatable type-constraints type-parameter
简而言之,我正在寻找以下两种方法中哪一种应该是首选的指导(以及为什么):
static IEnumerable<T> DistinctA<T>(this IEnumerable<T> xs)
{
return new HashSet<T>(xs);
}
static IEnumerable<T> DistinctB<T>(this IEnumerable<T> xs) where T : IEquatable<T>
{
return new HashSet<T>(xs);
}
Run Code Online (Sandbox Code Playgroud)
赞成的论据DistinctA:显然,约束T不是必需的,因为HashSet<T>它不需要它,并且因为任何实例T都保证可转换为System.Object,它提供与IEquatable<T>(即两种方法Equals和GetHashCode)相同的功能.(虽然非泛型方法会导致拳击与值类型,这不是我在这里关注的.)
赞成的DistinctB参数:泛型参数约束虽然不是绝对必要的,但是使调用者可以看到该方法将比较实例T,因此是一个正确Equals且GetHashCode应该正常工作的信号T.(毕竟,在没有明确实现的情况下定义一个新类型Equals并且GetHashCode非常容易发生,因此约束可能有助于及早发现一些错误.)
问题:是否存在建立和记录的最佳实践,建议何时指定此特定约束(T : IEquatable<T>),何时不指定?如果没有,上述论点之一是否有任何缺陷?(在这种情况下,我更喜欢经过深思熟虑的论点,而不仅仅是个人意见.)
首先考虑何时使用这两种机制中的哪一种可能很重要;我能想到的只有两个:
我想不出在任何情况下第一个定义会更受欢迎,而且它实际上超出了个人偏好。
其他人的想法?