重载原始运算符 (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>
.
有没有一种方法可以重载原语,例如用双精度数加法?我想在执行操作时自动舍入双打。我当前的代码是这样的:
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>
.