2013-03-22 65 views

回答

0

如果我有一串字符串,我可以用它來獲得一系列對象,因爲每個字符串也是一個對象。任何順序都是如此;給定任何順序時,我總能得到一系列對象。

如果我有一個可以比較兩個字符串的對象,我不能用它來比較兩個對象,因爲這兩個對象可能不是字符串。

原因是因爲IEnumerable<T>是協變的,而IComparerIEqualityComparer不是。 (不只是在C#的意義,雖然這也是如此,而且在概念上的計算機科學意義。)

至於爲什麼混凝土EqualityComparer<T>Comparer類實現這兩個接口,而不是不只是通用版本,是這個決定只能由選擇創建這些類型的員工真正解釋。我想他們這樣做是因爲當時有足夠多的人使用非通用版本的接口,他們希望這些類型可以與所有現有的非泛型代碼一起使用。

+0

但是這並不能解釋爲什麼EqualityComparer類會實現這兩個接口。例如,以下編譯但會引發異常:IEqualityComparer cmp = EqualityComparer .Default; Console.WriteLine(cmp.Equals(2,2)); – ChaseMedallion 2013-03-22 18:45:57

+0

@ChaseMedallion這是因爲「EqualityComparer .Default」不會返回「IEqualityComparer 」,它會返回一個「EqualityComparer 」。它是一個具體的類,而不是一個接口,具體類實現了兩個接口(儘管通用版本並非來自非泛型類)。 – Servy 2013-03-22 18:50:44

+0

我明白爲什麼要編譯,我只是想知道爲什麼框架設計師會選擇一種方式來爲類和另一種接口。 – ChaseMedallion 2013-03-22 19:03:46

相關問題