簡體   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