IE中没有使用的类(关于列表的问题)

时间:2011-02-23 01:59:51

标签: c# .net

我有一个定义为

的类
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的一个实现)。

2 个答案:

答案 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类型的对象)。