如何使用约束将T限制为值类型?

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,但仅此而已.

  • 处理它的另一种方法是对`int`或`decimal`列表进行特定的重载. (3认同)

ang*_*son 9

遗憾的是,无法指定仅允许特定值类型的泛型类型约束.更重要的是,即使它被允许也没有多大意义.

您可以将类指定为泛型约束,但这是因为您可以从类继承,因此约束设置了允许使用的类型的最小阈值.

如果允许值类型,您无法从这些类型继承,那么您实际上只能将自己限制为该类型.

因此你不能这样做,但你有几个选择:

  • 您可以在没有约束的情况下声明它,并在运行时处理问题.我不推荐这种方式
  • 您可以声明采用您感兴趣的特定类型的重载.

    由于你只有两种这样的类型,这就是我建议做的.

以下是您要声明的重载:

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)

  • 感谢您的建设性批评.不幸的是,标题**中的问题**具有误导性,因为如果我们将自己局限于此,那么答案很简单:`其中N:struct`.然而,真正的问题只有一个真实的,明确的答案,那就是"当前允许的C#语法是不可能的".我已经扩大了我的答案,涵盖了所有选项,希望它减少了人们在未来的时间. (2认同)

Jar*_*Par 9

使用约束无法做到这一点.假设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 {
  ...
}
Run Code Online (Sandbox Code Playgroud)