最佳答案
这把我难住了。我试图为Noda Time优化一些测试,在那里我们有一些类型初始化器检查。我想在将所有内容加载到新的AppDomain
之前,我应该找出类型有是否是类型初始值设定项(静态构造函数或具有初始值设定项的静态变量)。令我惊讶的是,对此的一个小测试抛出了NullReferenceException
-尽管在我的代码中没有空值。在没有调试信息的情况下进行编译时,它唯一的会引发异常。
下面是一个简短但完整的程序来演示这个问题:
using System;
class Test
{
static Test() {}
static void Main()
{
var cctor = typeof(Test).TypeInitializer;
Console.WriteLine("Got initializer? {0}", cctor != null);
}
}
以及汇编和输出的文字记录:
c:\Users\Jon\Test>csc Test.cs
Microsoft (R) Visual C# Compiler version 4.0.30319.17626
for Microsoft (R) .NET Framework 4.5
Copyright (C) Microsoft Corporation. All rights reserved.
c:\Users\Jon\Test>test
Unhandled Exception: System.NullReferenceException: Object reference not set to
an instance of an object.
at System.RuntimeType.GetConstructorImpl(BindingFlags bindingAttr, Binder bin
der, CallingConventions callConvention, Type[] types, ParameterModifier[] modifi
ers)
at Test.Main()
c:\Users\Jon\Test>csc /debug+ Test.cs
Microsoft (R) Visual C# Compiler version 4.0.30319.17626
for Microsoft (R) .NET Framework 4.5
Copyright (C) Microsoft Corporation. All rights reserved.
c:\Users\Jon\Test>test
Got initializer? True
现在,您会注意到我使用的是.NET4.5(发布候选版本)-可以在这里是相关的。对我来说,用其他各种原始框架(特别是“香草”.NET4)测试它有些棘手,但如果其他人可以轻松访问使用其他框架的机器,我会对结果感兴趣。
其他细节:
NodaTime.dll
来查看差异-只需__引用它的ABC1。有什么想法吗?框架Bug?
编辑:更好奇,更好奇。如果去掉Console.WriteLine
调用:
using System;
class Test
{
static Test() {}
static void Main()
{
var cctor = typeof(Test).TypeInitializer;
}
}
当使用csc /o- /debug-
进行编译时,它现在唯一的失败。如果你打开优化,(/o+
)它工作。但是,如果您按照原始版本包含Console.WriteLine
调用,则两个版本都将失败。