2010-11-05 86 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

相关问题