3

来自 MSDN

SequenceEqual(IEnumerable, IEnumerable) 方法并行枚举两个源序列,并使用 TSource、Default 的默认相等比较器比较对应的元素。默认相等比较器 Default 用于比较实现 IEqualityComparer 泛型接口的类型的值。

a)据我了解上面的引用,它暗示EqualityComparer<T>.Default用于比较实现 的类型的元素,IEqualityComparer<T>而实际上 Default用于返回IEqualityComparer<T>调用IEquatable<T>.Equals(假设T可分配给IEquatable<T>)或它调用的特定实现Object.Equals

b) 引用还表明TSourcemust implement IEqualityComparer<T>,这是不正确的:

   static void Main(string[] args)
   {
        Test test1 = new Test();
        Test test2 = new Test();

        Test[] list1 = { test1, test2 };
        Test[] list2 = { test1, test2 };

        bool eq = list1.SequenceEqual(list2); //works
   }     

  public class Test { }

那么我是否误解了报价试图传达的内容,或者报价完全错误?

谢谢你

4

2 回答 2

2

来自MSDN

Default 属性检查类型 T 是否实现了 System.IEquatable 接口,如果是,则返回使用该实现的 EqualityComparer。 否则,它返回一个使用 T 提供的 Object.Equals 和 Object.GetHashCode 覆盖的 EqualityComparer。

在您的示例中,它只使用引用相等,这是引用对象的默认相等实现。

于 2011-04-19T19:01:35.817 回答
2

TSource应该实施IEqualityComparer

但是EqualityComparer<T>.Default实现IEqualityComparer

默认相等比较器Default 用于比较实现IEqualityComparer 泛型接口的类型的值。

这太疏忽了,无法提及。

于 2011-04-20T10:52:55.233 回答