没有构造函数

时间:2016-06-28 10:15:49

标签: c#

我进入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时,有一堆问号而不是一堆变量。 Question marks?

无论我调用什么函数(包括调用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 };
事后来看,我应该看到这个。

1 个答案:

答案 0 :(得分:1)

您的异常位于静态构造函数中。你没有明确地写一个,但是生成了一个来保存静态字段的初始化。

private static decimal[] Ref_UA_R = { 4.1M / 1000.0M, 8.2M / 1000.0M, 0.0M };

编译器将这些初始值设定项中的代码放在静态构造函数中。

虽然这个特殊的行不会抛出DivideByZeroException,但显然有一些像这样的行。