2016-07-15 3 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.

Возможным решением могло бы стать использование атрибутов или OnDerserialized и поместить весь ваш код инициализации в отдельный метод (как описано в этом вопросе: 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

Yup. Просто видел ваш ответ примерно в то же время, что и мой, и поддержал ваше. Я не рассматривал сериализацию. Отлично сработано. –

Смежные вопросы