重载基本运算符(C#)

JPt*_*eK9 2 c# double operator-overloading

有没有办法我可以重载基元,例如加倍的加倍?我想在执行操作时自动将双精度取整。我当前的代码是这样的:

    class Test{
    public static double operator +(double x, double y){
        return Math.Round(x + y)
    }
}
Run Code Online (Sandbox Code Playgroud)

但不幸的错误是“二进制运算符的参数之一必须是包含类型”。

Bra*_*NET 5

不,这将是可怕的。使用您的库的用户会突然从其double变量中获得不同的行为!

但是,您可以编写和使用包装对象:

public struct MyDouble
{
     public double Value {get; set;}

     public MyDouble(double initValue)
     {
         Value = initValue;
     }         

     public static double operator +(MyDouble x, MyDouble y){
        return Math.Round(x.Value + y.Value)
     }
}
Run Code Online (Sandbox Code Playgroud)

除其他选项外,您还可以使其可转换为双精度值。这样,用户就知道他们正在使用您的对象,并且对它们的数学运算进行四舍五入时不会感到惊讶。

如果要从简单的double进行赋值,则需要定义一个隐式运算符,类似于Nullable<T>source)的隐式运算符:

 public static implicit operator MyDouble(double value) {
            return new MyDouble(value);
        }
Run Code Online (Sandbox Code Playgroud)