【发布时间】:2016-12-11 07:20:09
【问题描述】:
c# 如何为没有重载运算符的类定义 +、-、*、/ 运算符?我已经实现了以下课程。在不重载任何操作符的情况下,上述操作符可以正常工作,并且按照我要实现的方式工作! 代码如下:
class Number
{
private float mDecimal;
public float Decimal
{
get { return mDecimal; }
}
private int mOrder;
public int Order
{
get { return mOrder; }
}
public Number(float dec, int pow)
{
mDecimal = dec;
mOrder = pow;
}
public Number Power(Number number)
{
throw new NotImplementedException();
}
public static implicit operator Number(float num)
{
int pow = 0;
while (num > 1000)
{
num *= 0.1f;
++pow;
}
return new Number(num, pow);
}
public static implicit operator float(Number num)
{
float result = num.mDecimal;
for (int i = 0; i < num.mOrder; ++i)
result *= 10;
return result;
}
}
现在考虑这段使用代码:
Number n1 = 5;
Number n2 = 10;
Number n3 = n1 + n2;
n3 计算结果为 15!其他运营商也会出现这种情况!
【问题讨论】:
-
这是因为您已经定义了
implicit operator float- 所以+运算符会将您的值从Number隐式转换为float(System.Single),执行加法,然后转换返回。 -
你没有尝试在隐式运算符中放置一个断点,这是唯一可行的原因吗?
-
@Andrew 我是 C# 新手。我的背景是 C++,它不能隐式地处理这些情况。所以在不知道类型的情况下,由于 Number 可以转换为浮点数,所以它使用浮点数?我为另一个自定义类放置了其他转换运算符,但它再次使用了浮点运算符。编译器如何选择进行哪种转换来提供算术运算符?
标签: c#