有没有一种方法可以重载基本类型,例如双精度加法?我想在执行操作时自动四舍五入双精度。我的当前代码如下:
class Test{
public static double operator +(double x, double y){
return Math.Round(x + y)
}
}
但是,不幸的是出现了一个错误,提示“二进制运算符的其中一个参数必须是包含类型”。
有没有一种方法可以重载基本类型,例如双精度加法?我想在执行操作时自动四舍五入双精度。我的当前代码如下:
class Test{
public static double operator +(double x, double y){
return Math.Round(x + y)
}
}
但是,不幸的是出现了一个错误,提示“二进制运算符的其中一个参数必须是包含类型”。
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)
}
}
Nullable<T>
(source): public static implicit operator MyDouble(double value) {
return new MyDouble(value);
}
implicit
强制类型转换运算符。 - BradleyDotNET您无法对基本类型进行重载运算符。这将在您的代码库中造成混乱。
相反,您可以创建一个简单的包装器来包装基本类型,比如说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>
,可以扩展它。