Просто чтобы добавить кое-что к этому, приведенный ниже код переупорядочивает операнды, и исключение больше не генерируется, вместо этого значение myValue (правильно) является «неверным десятичным значением» при выходе из программы.
Обратите внимание, что изменился только порядок операндов, и мы расширили * = в main, чтобы сделать его более явным и поддерживать это.
Я бы не ожидал, что эти косметические изменения предотвратят появление исключения ... но они делают.
Возможно, это связано с тем, что значения помещаются в стек в другом порядке?
// If you invert the order of the operands to MyObject.*() , and expand out the *= in main,
// the thing runs without throwing the exception :s
// If you step through, the value of myValue is correctly ‘invalid decimal value’ after * by -1.
using System;
namespace ConsoleApplication19
{
class Program
{
static void Main(string[] args)
{
var o1 = (MyObject?)new MyObject(2.34M);
o1 = -1 * o1 ;
}
}
public struct MyObject
{
private Decimal myValue;
public MyObject(Decimal myValue)
{
this.myValue = myValue;
}
public static MyObject operator *(Decimal value2, MyObject value1)
{
value1.myValue *= value2;
return value1;
}
}
}