一位同事指出这个有趣的例外已经开始最近生成了。 (注意这是实际代码的玩具版本,为简单起见)
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;
}
}
}
标记的行抛出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;
}
}
}
注意我们所做的就是将参数的顺序颠倒为为MyObject定义的*,并将* =扩展为更明确。 我想也许这样的事实是值以不同的顺序被推到堆栈中避免了异常?但我很无能。
只是为了澄清:我不需要一个解决方案来阻止抛出异常,我们有,我更感兴趣的是为什么抛出异常,以及为什么要对代码进行微小的修改“修复”这个问题。
提示:同时也被告知Visual Studio 2010中没有引发异常,只有2008年。
感谢任何帮助:)