2016-07-15 43 views
2

我有兩個屬性一個充滿了C#6.0新的自動屬性初始化函數和一個只實現吸氣速記類:自動屬性初始值設定項未填寫

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

這個類的一個參數wcf端點,當調用此端點時,SampleProp1僅包含默認的枚舉值。

這是怎麼發生的?

回答

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)。

+0

閱讀本逝去的繁榮,學到了一些東西! – Michel

+0

備份字段是隻讀的。 –

+0

@DmitryDovgopoly:謝謝,糾正! –

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

問題來自未執行字段初始值設定項的反序列化程序。只需使用'new'創建一個類的實例就可以很好地工作。 –

+0

是的。剛剛在我的同一時間看到了你的答案,並且贊成你的答案。我沒有考慮過序列化。做得好。 –

相關問題