Как C# определить +, -, *,/операторов для классов, у которых нет перегруженных операторов? Я реализовал следующий класс. Без перегрузки каких-либо операторов упомянутые операторы работают, и они работают так, как я собирался реализовать! Вот код:Арифметические операторы по умолчанию в 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'), выполнять добавление, а затем конвертировать назад , – Dai
Разве вы даже не пытались помещать точку разрыва в неявные операторы, которые были единственной возможной причиной этого? – Andrew
@ Андрей Я новичок в C#. Мой фон - C++, который не работает в таких ситуациях неявно. Итак, не зная тип, так как ** Number ** конвертируется в float, он использует float? Я поместил другие операторы преобразования для другого настраиваемого класса, но он снова использует операторы float. Как компилятор выбирает, какое преобразование нужно сделать для обеспечения арифметических операторов? – Klaus