Pri*_*ERO 17 c# linq generics constraints
我想限制N可以使用约束可以采用的类型.我希望将N限制为int或decimal.
public static Chart PopulateInto<T, N>(List<T> yAxis, List<N> xAxis) where N : int, decimal
{
// Do stuff here
}
Run Code Online (Sandbox Code Playgroud)
任何帮助赞赏...
Pie*_*kel 21
无法将泛型参数约束到特定值类型.
但是,您可以强制它是一个值类型或struct
通过增加where N : struct
,但仅此而已.
遗憾的是,无法指定仅允许特定值类型的泛型类型约束.更重要的是,即使它被允许也没有多大意义.
您可以将类指定为泛型约束,但这是因为您可以从类继承,因此约束设置了允许使用的类型的最小阈值.
如果允许值类型,您无法从这些类型继承,那么您实际上只能将自己限制为该类型.
因此你不能这样做,但你有几个选择:
您可以声明采用您感兴趣的特定类型的重载.
由于你只有两种这样的类型,这就是我建议做的.
以下是您要声明的重载:
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
}
Run Code Online (Sandbox Code Playgroud)
此外,如果您对这些值的处理并不真正依赖于这些类型的数字质量,您只想限制可以处理的类型,那么您也可以私下声明原始方法,并调用此方法来自你的重载的方法.这仍然限制你的代码只允许int
或者decimal
,公开的,但您的实现仍然是通用的.如果不确切知道"在这里做什么"需要什么,就不可能判断这是否是一个可行的选择,但无论如何这里是代码:
public static Chart PopulateInto<T>(List<T> yAxis, List<int> xAxis)
{
return PopulateInto<T, int>(yAxis, xAxis);
}
public static Chart PopulateInto<T>(List<T> yAxis, List<decimal> xAxis)
{
return PopulateInto<T, decimal>(yAxis, xAxis);
}
private static Chart PopulateInto<T, N>(List<T> yAxis, List<N> xAxis) where N : struct
{
// Do stuff here
}
Run Code Online (Sandbox Code Playgroud)
使用约束无法做到这一点.假设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 {
...
}
Run Code Online (Sandbox Code Playgroud)