Почему только автоматически реализованные свойства могут иметь инициализаторы в C#? - PullRequest
1 голос
/ 29 февраля 2020

Я получаю сообщение об ошибке «только автоматически реализованные свойства могут иметь инициализаторы в C#» при попытке сделать следующее:

   public int Precision
    {
        get { return Precision; } 
        set
        {
            if (value < 0)
                Precision = 0;
            else if (value > 15)
                Precision = 15;
            else
                Precision = value;
        }
    } = 12;

Почему это не разрешено?

Ответы [ 2 ]

6 голосов
/ 29 февраля 2020

Уверен, это не совсем то, как вы используете get и set. Кроме того, ваша выгода страдает от самореференции. Я думаю, что это то, что вы хотите:

private int _precision = 12;
public int Precision {
    get => _precision;
    set {
        if (value < 0)
            _precision = 0;
        else if (value > 15)
            _precision = 15;
        else
            _precision = value;
    }
}
3 голосов
/ 29 февраля 2020

Ну, авто-свойство просто синтактично c сахар для свойства, которое получает и устанавливает автоматически созданное вспомогательное поле. Таким образом, следующие два кодовых сегмента похожи:

public int Precision { get; set; }

и

public int Precision
{
    get { return <Precision>k__BackingField; } 
    set { <Precision>k__BackingField = value; }
}

Однако, когда вы создаете собственный лог c в своей собственности, нет такой вещи, как автоматически отступающее поле. Фактически, вы могли бы даже сделать следующее без какого-либо вспомогательного поля:

set { Console.WrteLine(); }

Однако начальное значение разрешается в следующем конструкторе:

MyClass()
{ 
    this.<Precision>k__BackingField = myValue; 
}

Однако, когда такой поддержки нет -field, что должен делать компилятор здесь?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...