![](/img/trans.png)
[英]EqualityComparer<T>.Default doesn't return the derived EqualityComparer
[英]EqualityComparer<T>.Default misunderstanding?
我有一個Person
類,它從IEquatable<Person>
實現Equals()方法(也覆蓋了Object.Equals
方法,現在讓我們忽略GetHashcode()方法)
class Person : IEquatable<Person>
{
public string Name { get; set; }
public bool Equals(Person other)
{
return this.Name == other.Name;
}
public override bool Equals(object obj)
{
var person = obj as Person;
return person != null && person.Name == Name;
}
}
好的,讓我們開始:
Person p1 = new Person() { Name = "a" };
Person p2 = new Person() { Name = "a" };
List<Person> lst1 = new List<Person>() { p1 };
List<Person> lst2 = new List<Person>() { p2 };
讓我們來談談這一行:
bool b = lst1.SequenceEqual(lst2, EqualityComparer<Person>.Default);
理解這部分我有一個問題:
EqualityComparer<Person>.Default
我聽說EqualityComparer<Person>.Default
將檢查該類是否正在實現IEquatable
- 它將采用Equals(Person other)
方法而不是Equals(object obj)
。 它有避免拳擊的優勢
但
Equals(Person other)
將使用或withOUT EqualityComparer<Person>.Default
運行EqualityComparer<Person>.Default
(因為它正在實現IEquatable)
那么我們在談論什么拳擊? 沒有!
Equals(object obj)
運行的唯一時間是:
bool b = lst1.SequenceEqual(lst2,EqualityComparer<Object>.Default);
但我是一名程序員! 當它實際上是一個Person
時,我永遠不會發送一個object
!
我錯過了什么? 我在理解EqualityComparer<Object>.Default
的好處時遇到了麻煩。 有人可以舉個例子來證明我錯了嗎?
如果你傳入null
作為第二個參數或者根本沒有傳入第二個參數(基本相同),則SequenceEquals的實現將調用EqualityComparer<T>.Default
本身(反編譯Enumerable
以查看此內容) 。 這就解釋了為什么你沒有看到是否提供EqualityComparer<T>.Default
的區別。
所以最后,如果你想使用除 EqualityComparer<T>.Default
之外的相等比較器,第二個參數才有意義。
您可以傳入IEqualityComparer<object>.Default
是.NET 4中添加的通用逆變的影響。
本質上,只要需要IEqualityComparer<DerivedType>
,就可以使用IEqualityComparer<BaseType>
,其中DerivedType : BaseType
。 由於Person
派生自Object
,這意味着IEqualityComparer<Object>
可以在需要IEqualityComparer<Person>
任何地方使用。
答案在這里: http : //msdn.microsoft.com/en-us/library/ms131187(v = vs.110).aspx
對於值類型,您應始終實現IEquatable並重寫Object.Equals(Object)以獲得更好的性能。 Object.Equals框值類型並依賴於反射來比較兩個值的相等性。 你的Equals實現和你對Object.Equals的重寫應該返回一致的結果。
如果你不重寫Equals和GetHashCode,EqualityComparer.Default實際上會為你處理。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.