我想限制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