我有一個類定義爲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被調用。
如果我創建一個的IEqualityComparer爲IMyClass,並提供給鮮明的方法,那麼它的工作原理。
list.Distinct(new MyClassComparer());
其中MyClassComparer被定義爲:
class MyClassComparer: IEqualityComparer<IMyClass>
我的問題是爲何對MyClass的時候我定義我的列表,列表< IMyClass>不會被調用等於運算符,但它被調用當我將列表定義爲列表< MyClass>? (在MyClass是IMyClass的實現之後)。
因爲你說的名單是IMyClass,不是MyClass的,它不能保證它們都是同一類型的。它應該如何比較MyClassB:IMyClass和MyClass?你還沒有給它一個調用方法。當你處理像這樣的接口時,該對象被視爲_only_具有那些屬性/方法(以及任何通過繼承派生的...在這種情況下是Object.Equals(),然後調用它) – Rob 2011-02-23 02:19:20