结构有趣的小SEHexception问题,C#

tee*_*nan 5 .net c# exception

可能重复:
SEHException .net难题

一位同事指出了这个有趣的例外,它最近开始产生.(注意这是实际代码的玩具版本,为简单起见)

using System;

namespace ConsoleApplication19
{
    class Program
    {
         static void Main(string[] args)
        {
            var o1 = new MyObject?(new MyObject(2.34M));
            o1 *= -1; //This line throws SEHException
         }
    }

    public struct MyObject
    {
        public MyObject(Decimal myValue)
        {
            this.myValue = myValue;
        }

        private Decimal myValue;

        public static MyObject operator *(MyObject value1, Decimal value2)
        {
            value1.myValue *= value2;
            return value1;
        }
   }
}
Run Code Online (Sandbox Code Playgroud)

标记的行抛出SEHException'外部组件引发异常'.显然错误是该行上的-1应为-1M,因此arg的类型正确,此更改将停止抛出异常.有趣的是,通过对代码进行轻微的"修饰"更改,不再抛出异常.

// 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;
    }
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,我们所做的只是将参数的顺序颠倒为为MyObject定义的*,并将*=扩展为更明确.我想也许这样的事实是值以不同的顺序被推到堆栈中避免了异常?但我很无能为力.

只是为了澄清:我不需要一个解决方案来阻止异常被抛出,我们有,我更感兴趣的是为什么抛出异常,以及为什么对代码进行微小的修饰改变"修复"了这个问题.

提示:也被告知,视觉工作室2010中没有抛出异常,只有2008年.

任何帮助表示赞赏:)