繁体   English   中英

自动属性初始化器未填写

[英]Auto-Property Initializers not filled

我有一个带有两个属性的类,一个填充了C#6.0的新自动属性初始化程序,另一个仅实现了getter的简写形式:

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

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

为什么会这样呢?

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使用的反序列化器不执行字段初始化程序的事实。

一种可能的解决方案是利用OnDeserializingOnDerserialized属性,并将所有初始化代码放入单独的方法中(如以下问题所述: C#类中的字段初始化器在反序列化时不运行 )。

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; } }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM