重载原始运算符 (C#)

Overloading Primitive Operator (C#)

有没有一种方法可以重载原语,例如用双精度数加法?我想在执行操作时自动舍入双打。我当前的代码是这样的:

    class Test{
    public static double operator +(double x, double y){
        return Math.Round(x + y)
    }
}

但是有一个不幸的错误说 "One of the parameters of a binary operator must be the containing type"。

不,这将是可怕的。使用您的库的用户会突然从他们的 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)
     }
}

您还可以将其设为可施法 to/from 加倍,以及其他选项。通过这种方式,用户 知道 他们正在使用您的对象,并且当他们的数学运算四舍五入时不会感到惊讶。

如果你想从一个简单的双精度赋值,你需要定义一个隐式运算符,类似于Nullable<T> (source) :

 public static implicit operator MyDouble(double value) {
            return new MyDouble(value);
        }

您不能在原始类型上重载运算符。这会对您的代码库造成严重破坏。

你可以做的是围绕原始类型创建一个简单的包装器,比方说 RoundedDouble:

public struct RoundedDouble : IEquatable<RoundedDouble>, IComparable<RoundedDouble>
{
    public readonly double Value;

    public RoundedDouble(double value)
    {
        Value = Math.Round(value); // Or anything else
    }

    public static implicit operator RoundedDouble(double value)
    {
        return new RoundedDouble(value);
    }

    public static implicit operator double(RoundedDouble wrapper)
    {
        return wrapper.Value;
    }

    public int GetHashCode()
    {
        return Value.GetHashCode();
    }

    public bool Equals(object other)
    {
        if (other is RoundedDouble)
            return ((RoundedDouble)other).Value == Value;

        return false;
    }

    public string ToString()
    {
        return Value.ToString();
    }

    // Add your operators here, and implement the interfaces
}

这是一个结构。它具有与 double.

相同的值语义

通过添加运算符扩展它,并通过实施 至少 IEquatable<RoundedDouble>IComparable<RoundedDouble>.