一尘不染

是否存在针对“实数”类型的C#通用约束?[重复]

c#

这个问题已经在这里有了答案

7年前关闭。

可能重复:
仅整数的C#通用约束

问候!

我试图在C#中设置笛卡尔坐标系,但我不想将自己的坐标值限制为任何一种数值类型。有时它们可​​以是整数,而有时它们可​​以是有理数,具体取决于上下文。

这让我大叫“泛型类”,但是我对如何将类型限制为整数和浮点感到困惑。我似乎找不到涵盖任何实数概念的课程…

public class Point<T> where T : [SomeClassThatIncludesBothIntsandFloats?]  {
    T myX, myY;

    public Point(T x, T y) {
        myX = x;
        myY = y;
    }
}

Point<int> pInt = new Point<int>(5, -10);
Point<float> pFloat = new Point<float>(3.14159, -0.2357);

如果我想要这种自由度,我是否在选课时要进​​行“
typeof(T)”噩梦,清除掉布尔值,字符串,对象等?或更糟糕的是,我是否选择为要使用的每种数字类型创建一个类,并且每种数字都使用相同的内部数学公式?

任何帮助,将不胜感激。谢谢!


阅读 218

收藏
2020-05-19

共1个答案

一尘不染

您不能定义这样的约束,但是可以在运行时检查类型。但是,这不会帮助您进行计算。

如果要进行计算,则可以选择如下所示:

class Calculations<T, S> where S: Calculator<T>, new()
{
    Calculator<T> _calculator = new S();

    public T Square(T a)
    {
        return _calculator.Multiply(a, a);
    }

}

abstract class Calculator<T>
{
    public abstract T Multiply(T a, T b);
}

class IntCalculator : Calculator<int>
{
    public override int Multiply(int a, int b)
    {
        return a * b;
    }
}

同样,定义FloatCalculator和所需的任何操作。它的速度不是特别快,尽管比C#4.0
dynamic构造要快。

var calc = new Calculations<int, IntCalculator>();
var result = calc.Square(10);

副作用是,只有在Calculator传递给它的类型具有匹配的Calculator<T>实现时,您才能实例化,因此不必进行运行时类型检查。

这基本上就是海尔斯伯格在本次采访中所指的话题。就我个人而言,我仍然希望看到某种基本类型:)

2020-05-19