我有兩個屬性一個充滿了C#6.0新的自動屬性初始化函數和一個只實現吸氣速記類:自動屬性初始值設定項未填寫
public SampleEnum SampleProp1 { get; } = SampleEnum.Value1;
public SampleEnum SampleProp2 { get { return SampleEnum.Value1; } }
這個類的一個參數wcf端點,當調用此端點時,SampleProp1僅包含默認的枚舉值。
這是怎麼發生的?
我有兩個屬性一個充滿了C#6.0新的自動屬性初始化函數和一個只實現吸氣速記類:自動屬性初始值設定項未填寫
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 does not execute the field initializers使用解串器。
可能的解決方案是使用OnDeserializing
或OnDerserialized
屬性,並將所有初始化代碼放入單獨的方法中(如本問題中所述:Field Initializer in C# Class not Run when Deserializing)。
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; } }
}
}
問題來自未執行字段初始值設定項的反序列化程序。只需使用'new'創建一個類的實例就可以很好地工作。 –
是的。剛剛在我的同一時間看到了你的答案,並且贊成你的答案。我沒有考慮過序列化。做得好。 –
閱讀本逝去的繁榮,學到了一些東西! – Michel
備份字段是隻讀的。 –
@DmitryDovgopoly:謝謝,糾正! –