简而言之,我正在寻找关于以下两种方法中的哪一种应该优先(以及为什么)的指导:
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);
}
赞成的论点
DistinctA:显然,约束 onT不是必需的,因为HashSet<T>不需要它,并且因为 any 的实例T保证可转换为,它提供与(即两个方法和)System.Object相同的功能。(虽然非泛型方法会导致值类型的装箱,但这不是我在这里关心的。)IEquatable<T>EqualsGetHashCode支持 的论点
DistinctB:通用参数约束虽然不是绝对必要的,但使调用者可以看到该方法将比较 的实例T,因此是一个信号,Equals并且GetHashCode应该正确地工作于T。(毕竟,在没有显式实现的情况下定义新类型Equals并且GetHashCode很容易发生,因此约束可能有助于及早发现一些错误。)
问题:是否有既定并记录在案的最佳实践建议何时指定此特定约束 ( T : IEquatable<T>),何时不指定?如果没有,上述论点之一是否有任何缺陷?(在这种情况下,我更喜欢经过深思熟虑的论点,而不仅仅是个人意见。)