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