"实数"类型是否存在C#泛型约束?

Syn*_*dog 21 c# generics constraints

可能重复:
仅对整数的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);
Run Code Online (Sandbox Code Playgroud)

如果我想要这种自由度,那么当我在课堂上进行计算,除去bool,字符串,对象等时,我是否选择了"typeof(T)"噩梦?或者更糟糕的是,我是否选择为我想要使用的每种类型的数字创建一个类,每个都有相同的内部数学公式?

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

Tho*_*rin 16

您无法定义此类约束,但可以在运行时检查类型.但这对你的计算没有帮助.

如果你想做计算,这样的事情是一个选择:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

同样,定义一个FloatCalculator和您需要的任何操作.虽然比C#4.0 dynamic构造更快,但速度并不是特别快.

var calc = new Calculations<int, IntCalculator>();
var result = calc.Square(10);
Run Code Online (Sandbox Code Playgroud)

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

这基本上是Hejlsberg在本次采访中提到的问题.我个人仍然希望看到某种基类型:)


Mar*_*ell 12

这是一个非常常见的问题; 如果您使用的是.NET 3.5,那么在MiscUtil中有很多支持,通过Operator类,它支持内置类型和任何带有运算符的自定义类型(包括"提升"运算符); 特别是,这允许使用泛型,例如:

public static T Sum<T>(this IEnumerable<T> source) {
    T sum = Operator<T>.Zero;
    foreach (T value in source) {
        if (value != null) {
            sum = Operator.Add(sum, value);
        }
    }
    return sum;
}
Run Code Online (Sandbox Code Playgroud)

或者另一个例子; Complex<T>


Sta*_* R. 7

这是一个已知问题,因为没有算术类来自同一个类.所以你不能限制它.

你唯一能做的就是

where T : struct
Run Code Online (Sandbox Code Playgroud)

但这不完全是你想要的.

以下是特定问题的链接.

算术类型如int,double,decimal应该实现IArithmetic<T>

  • 您的链接会导致"找不到页面". (2认同)