Что выведет этот код?
var c = new Counter();
c.Value = 5;
Console.WriteLine($"{c.Value} {c.Raw} {c.GetRaw()}");
class Counter
{
private int field = 100;
public int Value
{
get => field;
set => field = value;
}
public int Raw => field;
public int GetRaw() => field;
}
Варианты:
A) 5 5 5
😎 5 100 100
C) 5 0 100
D) Код не скомпилируется
Ответ: **C) 5 0 100**
В C# 14 слово `field` внутри аксессоров свойства стало ключевым. Теперь оно означает **скрытое поле, которое компилятор создаёт для этого свойства**, даже если в классе уже есть член с таким именем.
Поэтому в этом коде три разных `field`:
```
Value → своё скрытое поле: записали 5, прочитали 5
Raw → тоже аксессор, но со своим скрытым полем: в него никто не писал, значит 0
GetRaw() → обычный метод, ключевое слово тут не действует, это поле класса: 100
```
Главная ловушка в строке `public int Raw => field;`. Выглядит как обычный метод-однострочник, но это свойство, а значит get-аксессор. Поле класса со значением 100 здесь вообще не видно.
До C# 14 этот же код выводил `5 5 5`: все три обращения шли к одному полю класса. После обновления он компилируется и тихо меняет поведение. Чтобы обратиться к старому полю, внутри аксессоров нужно писать `this.field` или `@field`.