C# 静态成员变量未在版本中初始化-编译器/clr错误?

C# 静态成员变量未在版本中初始化-编译器/clr错误?,c#,.net-4.0,clr,C#,.net 4.0,Clr,在VS2010、.NET 4.0下的调试模式和发布模式下获得的预期输出和输出: bar construct main 在VS2010调试器和WinDbg下,以发布模式不输出: main 程序在VS2005、.NET 2.0上不显示此行为 using System; namespace static_init { public class bar { public bar() { Console.WriteLine("b

在VS2010、.NET 4.0下的调试模式和发布模式下获得的预期输出和输出:

bar construct
main
在VS2010调试器和WinDbg下,以发布模式输出:

main
程序在VS2005、.NET 2.0上不显示此行为

using System;

namespace static_init
{
    public class bar
    {
        public bar()
        {
            Console.WriteLine("bar construct");
        }
    }

    class Program
    {
        public static bar blah = new bar();

        static void Main(string[] args)
        {
            Console.WriteLine("main");
            Console.ReadLine();
        }
    }
}
可能相关:

更新

在我的实际代码构造函数<代码>()(代码)>中,用C++(非托管)初始化一些互操作代码。它需要在这个库中的任何事情之前发生-是否有任何方法可以确保在不插入触及库中所有静态(带有未被外部引用的副作用)的

init()
函数的情况下

未来搜索者注意:我使用的是SWIG,这是他们在包装器生成代码中做出的假设
SWIGStringHelper
是目前的罪犯,但可能还有更多

结论


更新到SWIG的2.0版,它会根据更新版本的.NET的需要放入静态构造函数。

它可能会得到优化,因为您不使用它

它也不是一个编译器错误,它在语言规范中

17.4.5.1静态字段初始化

静态字段变量初始值设定项 类声明的 指定的作业顺序: 以文本顺序执行,其中 它们出现在类声明中。 如果是静态构造函数(§17.11) 存在于类中,执行 出现静态字段初始值设定项 在执行之前 静态构造函数。否则 执行静态字段初始值设定项 在依赖于实现的时间 在首次使用静电传感器之前 该类的字段

由于您从未使用过Program类的静态字段,因此静态初始值设定项不能保证运行(尽管它可能…上面的“依赖于实现的时间”)

更新
您可以通过使程序具有静态构造函数来实现所需的功能

静态程序(){}

或者可能通过访问另一个(可能是虚拟的)静态变量

注意.NET 4.0中关于静态初始化的一些更改。Jon Skeet写了一篇带有一些示例的博客文章:

如果想要精确初始化,应该使用静态构造函数(可能为空)


非常感谢“更新”和“结论”-我有非常相似的场景,也使用了旧的SWIG 1.3.40-刚刚更新到2.0.9,一切正常。“结论”为我节省了大量的调查时间!
using System;

namespace static_init
{
    public class bar
    {
        public bar()
        {
            Console.WriteLine("bar construct");
        }
    }

    class Program
    {
        public static bar blah = new bar();

        // This static constructor will make sure that the type Program 
        // is initialized before it is first used.
        //
        static Program()
        { }

        static void Main(string[] args)
        {
            Console.WriteLine("main");
            Console.ReadLine();
        }
    }
}