2009-12-31 21 views

回答

3

一般來說是的,但是,特別是與你的榜樣(求和兩個參數) - 你可以」不要使用泛型,因爲+運算符不是任何可以約束泛型類型參數的接口的一部分:)

(注:這是我的C#的部分談話,在其他語言中可能仍然是可能的)

+0

感謝您的回答!這是不是可以做到這一點,或者這是一個糟糕的設計決定?我正在考慮它現在寫入的方式,兩個參數都是不受限制的,所以有人可以傳入任何對象,並且+操作對於所有類型都不會重載,因此會中斷。這聽起來正確嗎? – 2009-12-31 21:21:16

+0

是的,CLR的一個缺失部分 - 是一個INumeric接口,它將包含那些運算符(應用於實現它們的所有核心類型 - int,uint,float,decimal等) – 2009-12-31 21:21:19

+0

@Scott Davies - No ,這是不可能的(讀 - 編譯錯誤),編譯器不知道如何將調用轉換爲'+'以獲得不受約束的類型。如果類型不受約束,則任何方法都是如此,而不僅僅是「+」。 – 2009-12-31 21:22:26

2

一些案件,有(不總是);儘管有相反的傳言,但這是可能的。我爲"MiscUtil"(免費等)編寫了一些代碼,完全是這個,它適用於所有類型與合適的運營商(甚至你自己的結構和類,或Nullable<T>等)。

這裏的問題是,沒有接口支持Add等,所以直到dynamic出現(在4.0)這是很棘手的做;但它可以做到的 - 這裏的usage page,具有simiplfied Sum(實際在「MiscUtil」代碼稍微複雜一些):

public static T Sum<T>(this IEnumerable<T> source) 
{ 
    T sum = Operator<T>.Zero; 
    foreach (T value in source) 
    { 
     if (value != null) 
     { 
      sum = Operator.Add(sum, value); 
     } 
    } 
    return sum; 
} 

再次,很多這是相對簡單的在4.0 dynamic ,因爲這支持運營商;然而,上次我以此爲基準,dynamic比我的(ab)使用Expression慢。

順便說一句,該標準LINQ 可以提供Min/Max的原因是因爲IComparable/IComparable<T>,通過Comparer<T>.Default協助。

相關問題