重载原始运算符(C#)

时间:2015-02-11 00:13:03

标签: c# double operator-overloading

有没有办法可以重载基元,例如加双打?我想在执行操作时自动舍入双打。我目前的代码是:

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

但是有一个不幸的错误,上面写着“二元运算符的一个参数必须是包含类型”。

2 个答案:

答案 0 :(得分:4)

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

除了其他选项之外,您还可以将其转换为/来自double。这样,用户知道他们正在使用您的对象,并且在他们的数学运算四舍五入时不会感到惊讶。

如果要从简单的double分配,则需要定义隐式运算符,类似于Nullable<T>source):

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

答案 1 :(得分:1)

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

你可以做的是在基本类型周围创建一个简单的包装器,比方说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相同的值语义。

通过添加运算符并至少实现 <{em> IEquatable<RoundedDouble>IComparable<RoundedDouble>来扩展它。