2009-10-19 21 views
1

正確地說,一個類中的哪些方法負責List<T>Contains()的操作?列表中的()方法<T>

我已經在我的課上重載了==。但它似乎沒有效果。

+0

這裏有一些很好的答案。爲什麼不接受... – Vaccano 2009-12-22 23:10:32

+0

我忘了接受。 – anonymous 2009-12-24 06:16:52

回答

11

它只會調用Equals() - 這就是所有需要被覆蓋(或者如果你對參考身份比較滿意的話)。如果類型實現IEquatable<T>,那麼該實現將優先於普通的Equals(object)使用。

特別地,從所述文檔List<T>.Contains

此方法確定使用 默認的相等比較 EqualityComparer(T).DefaultT,在列表中的 類型的值相等。

而且從EqualityComparer<T>.Default:類型T

Default屬性檢查是否 實現 System.IEquatable(T)通用接口 如果這樣返回使用該 實施的 EqualityComparer(T)。否則它返回 和EqualityComparer(T),其使用Object.EqualsObject.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會定義該運算符)(請參閱結構示例) )。

相關問題