2010-11-05 43 views
13

我想限制N可以使用約束的可能類型。我希望將N限制爲int或小數。如何使用約束將T限制爲值類型?

public static Chart PopulateInto<T, N>(List<T> yAxis, List<N> xAxis) where N : int, decimal 
{ 
    // Do stuff here 
} 

讚賞任何幫助...

+1

如果這些是您關心的唯一兩種類型,我認爲您可以重載該方法。當然,這是4重載,但這並不算太壞。 – 2010-11-05 19:59:08

回答

7

爲什麼不只是這樣做:

public static Chart PopulateInto<T>(List<T> yAxis, List<int> xAxis) 
{ 
    // Do stuff here 
} 

public static Chart PopulateInto<T>(List<T> yAxis, List<decimal> xAxis) 
{ 
    // Do stuff here 
} 
+1

我原本是這麼做的,但我希望有一些kewler – 2010-11-05 20:00:44

+10

imo,避免'kewl'並堅持可讀/正確。 – Marc 2010-11-05 20:05:17

+0

而且我的仿製藥已經關閉了,這就是我在星期五晚上寫回答的原因,讓我糾正一下。 – 2010-11-05 20:20:34

13

這是不可能來約束泛型參數爲特定值的類型。

但是,您可以強制它是一個類型或struct加入where N : struct,但僅此而已。

+1

處理它的另一種方法是爲'int'或'decimal'列表設置特定的重載。 – 2010-11-05 19:59:30

6

沒有辦法與約束做到這一點。儘管假設PopulateInto可以與通用N一起工作,但另一種方法是使核心算法是通用的和私有的,並提供2個公共過載,其分別採用intdecimal。這將產生類似的效果

public static Chart PopulateInto<T>(
    List<T> yAxis, 
    List<decimal> xAxis) { 

    return PopulateIntoCore(yAxis, xAxis); 
} 

public static Chart PopulateInto<T>(
    List<T> yAxis, 
    List<int> xAxis) { 

    return PopulateIntoCore(yAxis, xAxis); 
} 

private static Chart PopulateIntoCore<T, N>(
    List<T> yAxis, 
    List<N> xAxis) where N : struct { 
    ... 
} 
+0

前兩個應該公開,對嗎? ;-) – 2010-11-05 20:00:26

+1

@馬克,是的,那將是我答案的關鍵;)修正 – JaredPar 2010-11-05 20:02:03

2

正如Pieter所說,你不能使用編譯時檢查來達到此目的。但是,您可以在運行時執行以下操作:

if(!(typeof(N).equals(typeof(int32))) && !(typeof(N).equals(typeof(decimal)))) 
    // do something 
+1

是的,爲什麼不呢。拋出一個InvalidOperationException。 – 2010-11-05 20:30:41

相關問題