我想限制N可以使用約束的可能類型。我希望將N限制爲int或小數。如何使用約束將T限制爲值類型?
public static Chart PopulateInto<T, N>(List<T> yAxis, List<N> xAxis) where N : int, decimal
{
// Do stuff here
}
讚賞任何幫助...
我想限制N可以使用約束的可能類型。我希望將N限制爲int或小數。如何使用約束將T限制爲值類型?
public static Chart PopulateInto<T, N>(List<T> yAxis, List<N> xAxis) where N : int, decimal
{
// Do stuff here
}
讚賞任何幫助...
爲什麼不只是這樣做:
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
}
我原本是這麼做的,但我希望有一些kewler – 2010-11-05 20:00:44
imo,避免'kewl'並堅持可讀/正確。 – Marc 2010-11-05 20:05:17
而且我的仿製藥已經關閉了,這就是我在星期五晚上寫回答的原因,讓我糾正一下。 – 2010-11-05 20:20:34
這是不可能來約束泛型參數爲特定值的類型。
但是,您可以強制它是一個值類型或struct
加入where N : struct
,但僅此而已。
處理它的另一種方法是爲'int'或'decimal'列表設置特定的重載。 – 2010-11-05 19:59:30
沒有辦法與約束做到這一點。儘管假設PopulateInto
可以與通用N一起工作,但另一種方法是使核心算法是通用的和私有的,並提供2個公共過載,其分別採用int
和decimal
。這將產生類似的效果
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 {
...
}
前兩個應該公開,對嗎? ;-) – 2010-11-05 20:00:26
@馬克,是的,那將是我答案的關鍵;)修正 – JaredPar 2010-11-05 20:02:03
正如Pieter所說,你不能使用編譯時檢查來達到此目的。但是,您可以在運行時執行以下操作:
if(!(typeof(N).equals(typeof(int32))) && !(typeof(N).equals(typeof(decimal))))
// do something
是的,爲什麼不呢。拋出一個InvalidOperationException。 – 2010-11-05 20:30:41
如果這些是您關心的唯一兩種類型,我認爲您可以重載該方法。當然,這是4重載,但這並不算太壞。 – 2010-11-05 19:59:08