在.NET中,IEnumerable<T>
擴展IEnumerable
常常派上用場。令人沮喪的是,儘管和Comparer<T>
類實現了兩個接口,但IEqualityComparer<T>
和IComparer<T>
不擴展它們的非通用對應物。是否有這種差異的原因?爲什麼IEqualityComparer <T>在.NET中擴展IEqualityComparer
回答
如果我有一串字符串,我可以用它來獲得一系列對象,因爲每個字符串也是一個對象。任何順序都是如此;給定任何順序時,我總能得到一系列對象。
如果我有一個可以比較兩個字符串的對象,我不能用它來比較兩個對象,因爲這兩個對象可能不是字符串。
原因是因爲IEnumerable<T>
是協變的,而IComparer
和IEqualityComparer
不是。 (不只是在C#的意義,雖然這也是如此,而且在概念上的計算機科學意義。)
至於爲什麼混凝土EqualityComparer<T>
和Comparer
類實現這兩個接口,而不是不只是通用版本,是這個決定只能由選擇創建這些類型的員工真正解釋。我想他們這樣做是因爲當時有足夠多的人使用非通用版本的接口,他們希望這些類型可以與所有現有的非泛型代碼一起使用。
但是這並不能解釋爲什麼EqualityComparer類會實現這兩個接口。例如,以下編譯但會引發異常:IEqualityComparer cmp = EqualityComparer
@ChaseMedallion這是因爲「EqualityComparer
我明白爲什麼要編譯,我只是想知道爲什麼框架設計師會選擇一種方式來爲類和另一種接口。 – ChaseMedallion 2013-03-22 19:03:46
- 1. 爲什麼我們需要IEqualityComparer,IEqualityComparer <T>接口?
- 2. .NET中的IEqualityComparer <T>中GetHashCode的作用是什麼?
- 3. 爲什麼IEqualityComparer <T> Equals方法需要兩個參數?
- 4. 爲什麼不工作時,我已經定義IEqualityComparer <T>
- 5. IEqualityComparer <T>和IEquatable <T>和有什麼不一樣?
- 6. 實現的IEqualityComparer在C#.NET MVC
- 7. 爲什麼我需要在IEqualityComparer接口中使用GetHashcode()?
- 8. CollectionAssert.AreEquivalent with Custom IEqualityComparer
- 9. 的IEqualityComparer意思
- 10. 實施IEqualityComparer
- 11. IEqualityComparer異常
- 12. IEqualityComparer和singleton
- 13. IEqualityComparer vs EqualityComparer?
- 14. 使用IEqualityComparer <T>的建議最佳做法是什麼?
- 15. 使用ReferenceEquals的IEqualityComparer <T>
- 16. 加入+ IEqualityComparer <T>和HashCode
- 17. 簡單的IEqualityComparer <T>問題
- 18. 不同的IEqualityComparer <>問題
- 19. IEqualityComparer上的錯誤<T>
- 20. EF Distinct(IEqualityComparer)錯誤
- 21. c#中的IEqualityComparer不工作?
- 22. 爲什麼我的動態IEqualityComparer不起作用?
- 23. 爲什麼SequenceEqual需要IEqualityComparer而不是謂詞?
- 24. IEqualityComparer不在字典中調用子類
- 25. 如何在VB.NET中實現IEqualityComparer <T>?
- 26. 的IEqualityComparer匿名類型
- 27. 沒有IEqualityComparer實現的LINQ
- 28. IEqualityComparer不按預期工作
- 29. Linq除了自定義IEqualityComparer
- 30. 使用IEqualityComparer除了,Intersect
看起來像Eric Lippert的問題:) – MarcinJuraszek 2013-03-22 20:17:17