5

基本上,我有以下幾點:泛型約束 - 我不知道如何解決這種情況有兩種/或情況

public static bool IsBetween<T>(this T value, T a, T b) 
    where T : IComparable 
{ 
    ... 
} 

public static bool IsBetween<T>(this T value, T a, T b) 
    where T : IComparable<T> 
{ 
    ... 
} 

的問題是,我不能這樣做,因爲你不能即使約束條件不同,也會有相同簽名的成員。但是,沒有辦法說約束是IComparableIComparable<T>。所以,我不確定在這之外做什麼,只是選擇一個並隨它而行。而且,無論選擇哪一個,我都會因爲分開而不相互繼承(這是有道理的)而失去另一個。

我在這裏丟失了什麼,有沒有辦法使用兩者,或者我將不得不選擇一個(可能是通用版本)?

回答

8

我不明白爲什麼第一種方法是通用的。爲什麼不是這樣:

public static bool IsBetween(this IComparable value, IComparable left, IComparable right) 

什麼值使該方法通用添加?很明顯,你不會避免拳擊罰球,因爲當你打電話給CompareTo(object)時,這些值將被裝箱。

除非你有一些令人信服的理由使該方法具有通用性,否則不要使其具有通用性。然後它具有與另一種方法不同的簽名,並解決了您的問題。

+0

我從來沒有真的這樣想過。我想這是因爲我開始使用通用版本,然後複製/粘貼它並試圖快速更改。 – 2012-02-18 18:16:40

+0

此外,默認情況下會先選擇「IComparable 」選項,然後選擇「IComparable」選項? – 2012-02-18 22:10:28

+1

@ m-y:重載分辨率將選擇*更具體的*方法。如果沒有辦法確定哪一個更具體,那麼你會得到一個模糊性錯誤。 – 2012-02-18 23:28:45

3

在.NET方法解析過載不考慮返回類型和通用約束。所以即使IComparableIComparable<T>有共同點,但仍然不起作用。只需選擇IComparable<T>版本。標準的.NET類型,例如Int32,Decimal,DateTime ......無論如何都實現了這兩個接口。

+0

這就是我的想法,但我想確保我沒有錯過這裏的東西。我最終將會使用通用版本。我只是希望讓我的方法可用於其他僅實現「IComparable」的代碼,而不是兩者兼而有之(或者只是「IComparable 」)。 – 2012-02-18 13:05:48