自动属性初始化程序未填写

时间:2016-07-15 12:47:12

标签: c# .net

我有一个有两个属性的类,一个用c#6.0的新自动属性初始化器填充,另一个只用getter简写:

public SampleEnum SampleProp1 { get; } = SampleEnum.Value1;
public SampleEnum SampleProp2 { get { return SampleEnum.Value1; } }

此类是wcf端点的参数,当调用此端点时,SampleProp1仅包含默认枚举值。

为什么会这样?

2 个答案:

答案 0 :(得分:4)

C#6.0中的自动属性初始化程序是语法糖,编译器将为初始化为给定表达式的属性创建一个支持字段。

因此,您的代码等同于以下声明(我添加了一个类'SampleClass`以便澄清):

class SampleClass
{
    // compiler-generated backing field initialized by the field initializer
    private readonly SampleEnum __sampleProp1 = SampleEnum.Value1;

    public SampleEnum SampleProp1 { get { return __sampleProp1; } }

    public SampleEnum SampleProp2 { get { return SampleEnum.Value1; } }
}

您的问题来自WCF使用的解串器 does not execute the field initializers

可能的解决方案是使用OnDeserializingOnDerserialized属性并将所有初始化代码放入单独的方法中(如此问题中所述:Field Initializer in C# Class not Run when Deserializing)。< / p>

答案 1 :(得分:0)

SampleEnum真的是枚举吗?我在一个带有实际枚举的简单类中尝试了你的代码,它似乎运行正常。

我可以看到可能存在SampleEnum实际上是一个类的问题,并且在初始化具有属性的类时,Value1尚未初始化。

这是我尝试按预期工作的内容:

class Program
{
    static void Main(string[] args)
    {
        var x = new MyClass();
        Debug.Print("{0}", x.SampleProp1);
        Debug.Print("{0}", x.SampleProp2);
    }
    public class MyClass
    {
        public enum SampleEnum { Value0, Value1 , Value2 };
        public SampleEnum SampleProp1 { get; } = SampleEnum.Value1;
        public SampleEnum SampleProp2 { get { return SampleEnum.Value1; } }
    }
}