2011-10-07 93 views
1

通用contraint我試圖創建一個通用類,它的實現依賴於類型爲一個Int32Int64doublefloat,或decimal淨對結構類型

class Calculator<T> where T: int, double, float, decimal 

這是不對的,但我在與語法

+0

無論你正在試圖做的是不是在C#中的法律。 – Gabe

+0

好像你應該使用方法重載而不是泛​​型 –

回答

4

您不能在類型參數上指定約束條件,使其必須是指定的一組類型之一。請參閱MSDN for a list of valid constraints

對於特定類型的,你可以指定:

where T : struct, IComparable, IFormattable, IConvertible, 
      IComparable<T>, IEquatable<T> 

這可能會限制設定相當很好,雖然它也允許其他原始類型,如byteulong

+0

我正在嘗試創建一個通用計算器類,可以用指定的類型進行加,減,乘和除。這使我可以限制Generic類所允許的類型。好答案。 –

4

你不能這樣做的麻煩。你只能這樣做是爲了一個接口,classstruct,或空構造函數(new()),或基類。

請參見:http://msdn.microsoft.com/en-us/library/d5x73970.aspx

最接近的將是struct, IConvertable

一種技術我所看到的是使用靜態構造函數並拋出斷言或例外,但這不是編譯時檢查,僅在運行。

class Calculator<T> 
    where T : struct 
{ 
    static Calculator() 
    { 
    Debug.Assert(typeof(T) == typeof(int), "FAIL"); //TODO: extend to other types 
    } 
} 
+0

不,你也可以爲特定的類做它。例如「where T:Stream」。哦,或者一個類型參數。 –

+0

@JonSkeet我更新了我的答案。 –

+0

難道你不能通過使用'Caclulator'工廠來獲得編譯時檢查嗎?方法重載只適用於受支持的類型,並且不給'Calculator'一個公共構造函數? – Brian

8

我想創建一個泛型類,它的實現取決於類型是Int32,Int64,double,float還是decimal。

然後它不是通用。泛型類型對於所有可能的類型參數都是相同的,例如泛型隊列或通用字典。

「計算器」類是像這樣的功能給出的最常見的情形;我們始終得到此功能請求。我們假設將它用於假定未來版本的C#,該版本尚未公佈並且不存在。做好這個功能需要CLR的一個假想的未來版本的大量支持,這個版本還沒有被宣佈和不存在。這些情況並不是特別重要,所以請不要失望,如果它不成立。

有多種方式這樣的功能可以浮出水面。例如,我們可以說你可以在接口中放置靜態方法。數學運算符是靜態方法,所以你可以將一個類型參數約束爲一個實現靜態接口IAddable的類型,或者這樣的東西。

記住任何思索埃裏克使有關不存在的,並且可能不會存在僅僅是爲了您的娛樂發佈的產品的未來。

+1

+1票爲f#內聯功能。運行時反射式創建任何使用上述觸發完整的c#編譯器(有助於打包成一個你可能認識的人的服務)的東西。即使是反射式的情況下獲得調試器的支持也會很棒。是的,我知道它可以被濫用,但該死的,如果它不是很好 – ShuggyCoUk

+0

+1,希望這可以在C#6.0中實現。 – MgSam

+0

如果我屏住呼吸,我不知道哪個會首先存在:一個「完美的,功能完整」的C#版本,或半條命3。 –