CLRexception为什么会出现FatalExecutionEngineError?我们正在使用封装数值的结构,我发现在表达式中使用此结构的可空版本时,会发生FatalExecutionEngineError:附加信息:运行时遇到致命错误。错误地址位于线程0x52d8上的0x729c1e04。错误代码是0xc0000005。此错误可能是CLR中的错??误,也可能是用户代码中不安全或无法验证的部分中的错误。此错误的常见来源包括COM互操作或PInvoke的用户编组错误,这可能会损坏堆栈。我正在使用VisualStudioPremium2013Update3这是源代码(C#,针对.NETFramework4.5):使用System.Globalization;namespaceConsoleApplication4{publicstructNumber{ValueType_val;privateNumber(doubleval){this._val=val;}publicstaticimplicitoperatordouble(Numberval){returnConvert.ToDouble(val._val,CultureInfo.InvariantCulture);}publicstaticimplicitoperatorNumber(doubleval){returnnewNumber(val);}}classProgram{staticvoidMain(string[]args){数字?b=1.2;变量c=b-1.2;数b1=1.2;变量c1=b1-1.2;注意,添加这个解决了这个问题,所以它并不紧急,但我很想知道为什么会出现这个问题。publicstaticimplicitoperatordouble(Number?val){returnConvert.ToDouble(val.GetValueOrDefault()._val,CultureInfo.InvariantCulture);这看起来像一个编译器错误。问题发生在Main的第二行。数字?b=1.2;变量c=b-1.2;//问题出在这里注意VS2013生成的IL,问题出在IL_005C和包含的代码,这是不必要的生成:.methodprivatehidebysigstaticvoidMain(string[]args)cilmanaged{.entrypoint//代码大小116(0x74).maxstack2.localsinit(valuetype[mscorlib]System.Nullable`1V_0,valuetype[mscorlib]System.Nullable`1V_1,valuetype[mscorlib]System.Nullable`1V_2,valuetype[mscorlib]System.Nullable`1V_3,valuetype[mscorlib]System.Nullable`1V_4)//数字?b=1.2;IL_0000:nopIL_0001:ldloca.sV_0//bIL_0003:ldc.r81.2IL_000c:调用值类型Test.NumberTest.Number::op_Implicit(float64)IL_0011:调用实例voidvaluetype[mscorlib]System.Nullable`1::.ctor(!0)IL_0016:nopIL_0017:ldloc。0IL_0018:stloc.2//b//varc=b-1.2;IL_0019:ldloca.sV_2//bIL_001b:调用实例boolvaluetype[mscorlib]System.Nullable`1::get_HasValue()IL_0020:brtrue。sIL_002dIL_0022:ldloca.sV_3IL_0024:initobjvaluetype[mscorlib]System.Nullable`1IL_002a:ldloc.3IL_002b:br.sIL_003eIL_002d:ldloca.sV_2IL_002f:调用实例!0valuetype[mscorlib]System.Nullable`1::GetValueOrDefault()IL_0034:调用float64Test.Number::op_Implicit(valuetypeTest.Number)//嗯,什么?编译器错误的第一部分是它不必要地创建一个可为空的浮点数IL_0039:newobjinstancevoidvaluetype[mscorlib]System.Nullable`1::.ctor(!0)IL_003e:nopIL_003f:stloc.3IL_0040:ldloca.sV_3IL_0042:调用实例boolvaluetype[mscorlib]System.Nullable`1::get_HasValue()IL_0047:brtrue.sIL_0055IL_0049:ldloca.sV_4IL_004b:initobjvaluetype[mscorlib]System.Nullable`1IL_0051:ldloc.sV_4IL_0053:br.sIL_0071IL_0055:ldloca.sV_3//不过,这是真正的错误。它将float64传递给期望数字结构的op_ImplicitIL_0057:调用实例!0valuetype[mscorlib]System.Nullable`1::GetValueOrDefault()IL_005c:调用float64Test.Number::op_Implicit(valuetypeTest.Number)IL_0061:conv.r8IL_0062:ldc.r81.2IL_006b:subIL_006c:newobjinstancevoidvaluetype[mscorlib]System.Nullable`1::.ctor(!0)IL_0071:nopIL_0072:stloc.1IL_0073:ret}//结束方法Program::MainRoslyn(也使用其VS14CTP)产生不同的IL,没有这个问题,代码几乎相同,只是它省略了IL_0039和IL_0061之间的IL。以上是C#学习教程:CLRexception为什么会出现FatalExecutionEngineError?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
