1
A
回答
11
它只會調用Equals()
- 這就是所有需要被覆蓋(或者如果你對參考身份比較滿意的話)。如果類型實現IEquatable<T>
,那麼該實現將優先於普通的Equals(object)
使用。
特別地,從所述文檔List<T>.Contains
:
此方法確定使用 默認的相等比較
EqualityComparer(T).Default
爲T
,在列表中的 類型的值相等。
而且從EqualityComparer<T>.Default
:類型T
的
Default
屬性檢查是否 實現System.IEquatable(T)
通用接口 如果這樣返回使用該 實施的EqualityComparer(T)
。否則它返回 和EqualityComparer(T)
,其使用Object.Equals
和Object.GetHashCode
提供的 覆蓋T
提供。
我不相信它會根本用GetHashCode
。
1
它要麼調用Object.Equals()
或者,如果你已經實現了,IEquatable<T>.Equals()
:
private static EqualityComparer<T> CreateComparer()
{
Type c = typeof(T);
if (c == typeof(byte))
{
return (EqualityComparer<T>) new ByteEqualityComparer();
}
if (typeof(IEquatable<T>).IsAssignableFrom(c))
{
return (EqualityComparer<T>) typeof(GenericEqualityComparer<int>).TypeHandle.CreateInstanceForAnotherGenericParameter(c);
}
if (c.IsGenericType && (c.GetGenericTypeDefinition() == typeof(Nullable<>)))
{
Type type2 = c.GetGenericArguments()[0];
if (typeof(IEquatable<>).MakeGenericType(new Type[] { type2 }).IsAssignableFrom(type2))
{
return (EqualityComparer<T>) typeof(NullableEqualityComparer<int>).TypeHandle.CreateInstanceForAnotherGenericParameter(type2);
}
}
return new ObjectEqualityComparer<T>();
}
2
從.NET準則 - 如果實現==總是提供的Object.Equals()的實現和=運營商。原因在於運算符不是任何接口的一部分,並且在泛型實現中不允許使用它們(List類不能在T上調用==運算符,因爲不能保證T會定義該運算符)(請參閱結構示例) )。
相關問題
- 1. Java列表<Parent>和列表<Children>方法
- 2. 無法從AD獲得TGT
- 3. 在方法中返回列表<?>的用法是什麼?
- 4. C#列表<MyObj> Remove方法
- 5. 無法將方法1中的列表<string>傳遞給方法2
- 6. 任何簡單的方法來投票列表<int?>列表<int>
- 7. C# - 簡單的方法來「投」列表<BaseClass>列表<DerivedClass>?
- 8. 與發送列表<T>爲IEnumerable <T>的方法
- 9. 類型列表<Object[]>中的方法addAll(Collection <?extends Object []>)不適用於參數(列表<String>)
- 10. 無法從SQLIte查詢方法中檢索列表<String>
- 11. asp.net從列表<>方法得到值方法
- 12. 使用返回列表中的變量<>方法
- 13. 使用equals方法獲取列表<Object>中的對象?
- 14. 如何在C#中執行列表<String[]>的Web方法?
- 15. 列表中的選擇方法<t>集合
- 16. 從列表中刪除重複項的C#方法<T>
- 17. 類中的方法列表
- 18. 分配列表<T>到IEnumerable <T>靜態方法
- 19. .NET 4.0中的表達式樹:Expression.Call無法在類型列表中找到方法「get_Item」列表<T>
- 20. 無法用包中的方法在列表<Object>中存儲對象?
- 21. 部隊更新TGT
- 22. 如何在POST方法中映射列表<Item> RequestMapping
- 23. 在Url.Action中使用列表<int>方法
- 24. 爲什麼ForEach方法僅在列表<T>集合中?
- 25. 列表<T>在C#中添加方法#
- 26. 無法從基類的列表<T>中訪問子類的方法。
- 27. 儘管allowtgtsessionkey註冊表項無法檢索TGT
- 28. 無法從列表<T>轉換爲列表<T>
- 29. 無法從列表<Bar>轉換到列表<Foo>
- 30. 方法列表
這裏有一些很好的答案。爲什麼不接受... – Vaccano 2009-12-22 23:10:32
我忘了接受。 – anonymous 2009-12-24 06:16:52