有没有办法可以重载基元,例如加双打?我想在执行操作时自动舍入双打。我目前的代码是:
class Test{
public static double operator +(double x, double y){
return Math.Round(x + y)
}
}
但是有一个不幸的错误,上面写着“二元运算符的一个参数必须是包含类型”。
答案 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>
来扩展它。