简而言之,我正在寻求关于以下两种方法应该优先选择哪一种(以及为什么)的指导:
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
的理由:显然,对T
的约束是不必要的,因为HashSet<T>
并不需要它,并且因为任何T
的实例都可以转换为System.Object
,提供与IEquatable<T>
相同的功能(即两个方法Equals
和GetHashCode
)。 (虽然非泛型方法将导致值类型装箱,但这不是我关心的问题。)支持使用
DistinctB
的理由:虽然泛型参数约束并不是绝对必要的,但它向调用者明确了该方法将比较T
的实例,并因此表明Equals
和GetHashCode
应该正确地为T
工作。 (毕竟,定义一个新类型而没有明确实现Equals
和GetHashCode
很容易出错,因此该约束可能有助于尽早发现一些错误。)
问题:是否存在已建立和记录的最佳实践,推荐何时指定特定的约束(T : IEquatable<T>
),何时不指定?如果没有,上述哪种论点有缺陷?(在这种情况下,我更喜欢深思熟虑的论点,而不仅仅是个人意见。)