2011-02-23 49 views
2

我有一個類定義爲IEquatable不被使用(約解釋問題)

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(); 

在上述代碼中,不同的正確調用MyClass.Equals

但是如果我改用接口來定義列表(a S下方所示),該從MyClass的的Equals不會被調用

List<IMyClass> list = new List<IMyClass>(); 
//fill list here with objects of type MyClass 
var notADistinctList = list.Distinct(); 
在上面的代碼

- notADistinctList是不是一個獨特的名單,因爲它看起來像等於從MyClass的運營商不會被調用和基礎Object.Equals被調用。

如果我創建一個的IEqualityComparerIMyClass,並提供給鮮明的方法,那麼它的工作原理。

list.Distinct(new MyClassComparer()); 

其中MyClassComparer被定義爲:

class MyClassComparer: IEqualityComparer<IMyClass> 

我的問題是爲何對MyClass的時候我定義我的列表,列表< IMyClass>不會被調用等於運算符,但它被調用當我將列表定義爲列表< MyClass>? (在MyClass是IMyClass的實現之後)。

回答

4

你的接口沒有實現IEquatable,只有你的具體類一樣。比較它們時,它並不關心你使用的具體類(因爲你說它是一個接口)。

嘗試是這樣的:

public class MyClass : IMyClass 
{ 
    public bool Equals(IMyClass other) 
    {  
    } 
} 

public interface IMyClass : IEquatable<IMyClass> 
{ 

} 
1

我想出溶液,

我在上面的代碼的問題是,IEquatable已於MyClass的定義。

相反,如果我定義它IMyClass(IEquatable),那麼修復該問題。

interface IMyClass: IEquatable<IMyClass>{} 

class MyClass: IMyClass 
{ 
//appropriately defined bool Equals(IMyClass other) and int GetHashCode() methods 
} 

顯然如在我的問題指出,其它的解決方案是提供一個的IEqualityComparer到鮮明的方法。

雖然我仍想知道爲什麼從MyClass的Equals方法是不是IMyClass的列表自動調用(如列表中的對象是所有類型的MyClass)。

+0

因爲你說的名單是IMyClass,不是MyClass的,它不能保證它們都是同一類型的。它應該如何比較MyClassB:IMyClass和MyClass?你還沒有給它一個調用方法。當你處理像這樣的接口時,該對象被視爲_only_具有那些屬性/方法(以及任何通過繼承派生的...在這種情況下是Object.Equals(),然後調用它) – Rob 2011-02-23 02:19:20