我有一个定义为
的类class MyClass : IMyClass, IEquatable<MyClass>
{
//appropriately defined bool Equals(MyClass other) and int GetHashCode() methods
}
当我拨打以下代码时:
List<MyClass> list = new List<MyClass>();
//fill list here and then call distinct
var distinctList = list.Distinct();
在上面的代码中,distinct正确调用 MyClass.Equals
但是如果我改为使用接口来定义列表(如下所示),则不会调用来自MyClass的等于:
List<IMyClass> list = new List<IMyClass>();
//fill list here with objects of type MyClass
var notADistinctList = list.Distinct();
在上面的代码中 - notADistinctList不是一个不同的列表,因为看起来没有调用MyClass的Equals运算符并且正在调用基础的Object.Equals。
如果我为 IMyClass 创建 IEqualityComparer 并将其提供给Distinct方法,那么它可以正常工作。
list.Distinct(new MyClassComparer());
其中MyClassComparer定义为:
class MyClassComparer: IEqualityComparer<IMyClass>
我的问题是当我将列表定义为List&lt;时,为什么不会调用MyClass上的Equals运算符? IMyClass&gt; ,但是当我将列表定义为List&lt;时,会调用它。 MyClass&gt;? (在MyClass之后是IMyClass的一个实现)。
答案 0 :(得分:4)
你的界面没有实现IEquatable,只有你的具体类才有。比较它们时,它并不关心你正在使用的具体类(因为你说它是一个接口)。
尝试这样的事情:
public class MyClass : IMyClass
{
public bool Equals(IMyClass other)
{
}
}
public interface IMyClass : IEquatable<IMyClass>
{
}
答案 1 :(得分:1)
我找到了解决方案,
我在上面的代码中的问题是IEquatable是在MyClass上定义的。
相反,如果我在IMyClass上定义它(IEquatable),那么这就解决了这个问题。
interface IMyClass: IEquatable<IMyClass>{}
class MyClass: IMyClass
{
//appropriately defined bool Equals(IMyClass other) and int GetHashCode() methods
}
显然,正如我的问题所述,另一种解决方案是为Distinct方法提供IEqualityComparer。
虽然我仍然想知道为什么MyClass的Equals方法没有在IMyClass列表上自动调用(因为列表中的对象都是MyClass类型的对象)。