我进入TypeInitializationException
。内部异常是DivideByZeroException
。查看内部异常的堆栈跟踪,我得到了这个:
à System.Decimal.FCallDivide(Decimal& d1, Decimal& d2)
à System.Decimal.op_Division(Decimal d1, Decimal d2)
à DimensionnelJDP.IncertitudeObject..cctor() dans \IncertitudeObject.cs:ligne 108
触发异常的代码是:
IncertitudeObject io = new IncertitudeObject();
io.Compute_E( Config, ( (EmpilementObject)row[ "Empilement" ] ).pile ); //Exception here
我对这个问题的调查让我看到,当我查看io
时,有一堆问号而不是一堆变量。
无论我调用什么函数(包括调用io.ToString()
时)都会发生同样的异常,而io
总是充满问号。
我认为IncertitudeObject
没有正确初始化,但是如何超越我。它没有构造函数,所以我假设它使用了该语言的默认隐式无参数构造函数。所以,我真的不知道这里发生了什么。
上周工作正常,我记得没有重大变化。相同的设置也适用于我的解决方案的其他项目。
以下是我的结构的快速浏览:
public struct IncertitudeObject
{
private decimal ua;
public decimal Ua{ get { return ua; } }
//And a dozen more like it
private static decimal[] Ref_UA_R = { 4.1M / 1000.0M, 8.2M / 1000.0M, 0.0M };
//This is line 108 that the stack trace points to
//And there are also a dozen more like it
//Bunch of functions that do things that are never called when the exception happens
//Distinct lack of constructor
}
编辑:所以我发现了问题。我不知道整个静态构造函数。显然,静态场的顺序非常重要。不得不切换:
private static decimal[] Ref_UB2_E = { R2 * 10.0M / ( 2.0M * R3 ) / 1000.0M, 20.0M / ( 2.0M * R3 ) / 1000.0M, 50.0M / ( 2.0M * R3 ) / 1000.0M };
private static decimal R2 = (decimal)Math.Sqrt( 2 );
private static decimal R3 = (decimal)Math.Sqrt( 3 );
到:
private static decimal R2 = (decimal)Math.Sqrt( 2 );
private static decimal R3 = (decimal)Math.Sqrt( 3 );
private static decimal[] Ref_UB2_E = { R2 * 10.0M / ( 2.0M * R3 ) / 1000.0M, 20.0M / ( 2.0M * R3 ) / 1000.0M, 50.0M / ( 2.0M * R3 ) / 1000.0M };
事后来看,我应该看到这个。
答案 0 :(得分:1)
您的异常位于静态构造函数中。你没有明确地写一个,但是生成了一个来保存静态字段的初始化。
private static decimal[] Ref_UA_R = { 4.1M / 1000.0M, 8.2M / 1000.0M, 0.0M };
编译器将这些初始值设定项中的代码放在静态构造函数中。
虽然这个特殊的行不会抛出DivideByZeroException,但显然有一些像这样的行。