C# 在WinRT中,静态字段根本没有初始化

C# 在WinRT中,静态字段根本没有初始化,c#,windows-8,windows-runtime,C#,Windows 8,Windows Runtime,我有这样的代码 public class SomeClass { private static int staticField = 10; } 代码永远不会执行,并且staticField的默认值为0。 此外,该代码还会导致MVVMlight的SimpleIoc引发异常,代码如下: SimpleIoc.Default.Register<SomeClass>(); 这很奇怪。 我正在使用Win8 RTM x64+VS2012 Express for Windows 8。这肯

我有这样的代码

public class SomeClass
{
    private static int staticField = 10;
}
代码永远不会执行,并且staticField的默认值为0。 此外,该代码还会导致MVVMlight的SimpleIoc引发异常,代码如下:

SimpleIoc.Default.Register<SomeClass>();
这很奇怪。
我正在使用Win8 RTM x64+VS2012 Express for Windows 8。

这肯定是MVVMLight的SimpleIoc中的一个错误。我已经用LinqPad尝试过了,问题是当您向类中添加静态字段时,字段初始值设定项会添加一个静态ctor

结果是类SomeClass有两个SimpleIoc的系数,这导致了您描述的异常

解决方法是向类中添加默认构造函数,并使用
PreferredConstructorAttribute
对其进行修饰,但这将导致对SimpleIoc的依赖

另一个解决方案是将静态字段更改为常量值

public class SomeClass
{
    private const int staticField = 10;
}
或者使用Register方法的重载为实例创建提供工厂方法

SimpleIoc.Default.Register<SomeClass>(() => new SomeClass())
问题在于线路

var constructorInfos = resolveTo.GetTypeInfo().DeclaredConstructors.ToArray();

它返回一个数组,其中包含两个构造函数信息,这两个构造函数信息都是在没有PreferredConstructorAttribute的情况下定义的,这将导致异常。

异常与静态字段无关。例外情况是,您在某个类上定义了多个构造函数,SimpleIoc不知道使用哪一个来创建实例。不,我没有任何构造函数。在我移除静态字段之后,它将不再抛出异常。您可以自己测试它。您可以用错误的值显示访问此静态字段的代码吗?在确定需要静态构造函数之前不调用它是正常的(确切的时间非常复杂);我没有静态构造函数,所以我不知道你的意思。我认为这是winrt中的一个错误,因为在常规的.net中,这很好。是字段初始值设定项,而不是字段,导致添加静态构造函数。有趣的是,MVVMLight认为它是一个实例构造函数,虽然这个解决方法很好,但现在我不需要构造函数,所以我只能添加一个空的构造函数来满足MVVMLight。我不使用工厂来注册类型,如SimpleIoc.Default.register(()=>new SomeClass())@伊姆根。我已将您的解决方案添加到我的答案中。@Jehof,但是WinRT错误没有执行静态字段初始化怎么办
    void Main()
{
    var x = GetConstructorInfo(typeof(SomeClass));

    x.Dump();
    x.IsStatic.Dump();
}


public class PreferredConstructorAttribute : Attribute{

}
public class SomeClass{
  private static int staticField = 10;

}

private ConstructorInfo GetConstructorInfo(Type serviceType)
        {
            Type resolveTo = serviceType;


//#if NETFX_CORE
            var constructorInfos = resolveTo.GetTypeInfo().DeclaredConstructors.ToArray();
            constructorInfos.Dump();
//#else
//          var constructorInfos = resolveTo.GetConstructors();
//constructorInfos.Dump();
//#endif

            if (constructorInfos.Length > 1)
            {
                var preferredConstructorInfos
                    = from t in constructorInfos
//#if NETFX_CORE
                       let attribute = t.GetCustomAttribute(typeof (PreferredConstructorAttribute))
//#else
//                     let attribute = Attribute.GetCustomAttribute(t, typeof(PreferredConstructorAttribute))
//#endif
                       where attribute != null
                       select t;

preferredConstructorInfos.Dump();

var preferredConstructorInfo = preferredConstructorInfos.FirstOrDefault ( );
                if (preferredConstructorInfo == null)
                {
                    throw new InvalidOperationException(
                        "Cannot build instance: Multiple constructors found but none marked with PreferredConstructor.");
                }

                return preferredConstructorInfo;
            }

            return constructorInfos[0];
        }
// Define other methods and classes here
var constructorInfos = resolveTo.GetTypeInfo().DeclaredConstructors.ToArray();