Предупреждение при инициализации свойства в классе с основным конструктором

Я заметил, что фрагмент, подобный приведенному ниже, отмечает инициализацию свойства предупреждением.

public sealed class C(int a)
{
    public int A { get; } = a;  //<--here

    public int Sum(int b)
    {
        return a + b;
    }
}

В предупреждении говорится:

предупреждение CS9124: параметр «int a» фиксируется в состоянии включающий тип и его значение также используются для инициализации поля, собственность или событие.

Однако, если я пропущу дальнейшее использование переменной a, предупреждение исчезнет.

public sealed class C(int a)
{
    public int A { get; } = a;

    public int Sum(int b)
    {
        return b;  //<-- no more 'a' used here
    }
}

Сейчас мне не очень ясна причина предупреждения, хотя у меня есть подозреваемый. Это потому, что в данном случае любая модификация a в классе не изменит свойство A?

Здесь говорится: «CS9124: Параметр фиксируется в состоянии включающего типа, и его значение также используется для инициализации поля, свойства или события. Это предупреждение указывает, что параметр конструктора вложенного типа также фиксируется. по включающему типу. Вероятно, параметр сохраняется дважды». Чего-то, чего вы, возможно, захотите избежать.
Clemens 12.03.2024 14:41

@Клеменс, это именно то, что показывает скомпилированный исходный код SharpLab: есть два поля поддержки.

Mario Vernari 12.03.2024 14:42
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
5
2
1 120
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это происходит потому, что компилятор сгенерирует одно резервное поле для a, используемого в Sum, и другое резервное поле для автоматического свойства A.

Обратите внимание, что a является изменяемым, а A — нет, поэтому вы можете сделать:

public void MutateA(int i) => a += i;

Что повлияет Sum, но не повлияет A:

C c = new C(42);
c.MutateA(7);
Console.WriteLine(c.A); // Prints 42
Console.WriteLine(c.Sum(0)); // Prints 49

public sealed class C(int a)
{
    public int A { get; } = a;  //<--here

    public int Sum(int b)
    {
        return a + b;
    }

    public void MutateA(int i) => a += i;
}

Обходным решением/исправлением было бы использование A вместо a в Sum:

public int Sum(int b) =>  A + b;

Смотрите также:

окей, мой подозреваемый был прав. Однако это предупреждающее сообщение не очень полезно.

Mario Vernari 12.03.2024 14:41

да... это тоже самая критикуемая ошибка первоначальных конструкторов. Префикс readonly был бы полезен.

Mario Vernari 12.03.2024 14:45

@MarioVernari «Префикс только для чтения был бы полезен». - да, языковая группа AFAIK рассматривает это для следующего выпуска. Но, возможно, это должно было быть поведением по умолчанию.

Guru Stron 12.03.2024 14:53

Другие вопросы по теме