Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Инициализатор полей не может ссылаться на нестатическое поле, метод или свойство name.
Поля экземпляров нельзя использовать для инициализации других полей экземпляров за пределами метода.
Почему эта ошибка возникает
Компилятор применяет это ограничение из-за работы инициализации объектов в C#. При создании объекта инициализаторы полей обрабатываются перед выполнением любого кода конструктора. На этом этапе:
Ограничение зависимостей полей. Хотя инициализаторы полей обрабатываются в лексическом порядке в одном файле, правило предотвращает зависимости между полями, чтобы разрешить авторам классов переупорядочение полей без введения ошибок компилятора. Для частичных классов порядок инициализаторов полей в разных исходных файлах не указан.
Объект не полностью построен: когда инициализаторы полей выполняются, экземпляр объекта находится в неполном состоянии. Разрешение ссылок между полями на этом этапе может привести к доступу к неинициализированной памяти или непредсказуемому поведению.
Безопасность компилятора. Это ограничение предотвращает потенциальные ошибки среды выполнения и гарантирует прогнозируемую поведение построения объектов.
Компилятор обнаруживает этот шаблон во время компиляции и сообщает CS0236, чтобы предотвратить эти потенциальные проблемы.
Исправление этой ошибки
Перенесите инициализацию в конструктор: выполните инициализацию в конструкторе экземпляра, где все поля гарантированно доступны.
Используйте статические поля: если ссылка на поле не требует его экземплярности, рекомендуется сделать его статическим.
Используйте значения по умолчанию: инициализируйте поля с литеральными значениями или выражениями, которые не ссылаются на другие члены объекта.
Отложенная инициализация: используйте свойства с полями резервной копии для сложной логики инициализации, которая зависит от других элементов экземпляра.
Основной конструктор: используйте первичные конструкторы для инициализации общедоступного поля со значением поля экземпляра или значения, заданного в качестве аргумента конструктора.
Пример
В следующем примере генерируется ошибка CS0236 и показано, как ее исправить:
public class MyClass
{
public int i = 5;
// CS0236: Field initializer cannot reference instance field 'i'
// This restriction allows class authors to rearrange fields without compiler errors
public int j = i; // CS0236
public MyClass()
{
// This works because both fields are guaranteed to be initialized
// before constructor code runs
j = i;
}
}
CS0236 также можно исправить с помощью основного конструктора , как показано в следующем примере:
public class MyClass
{
public int i = 5;
public int j => i;
}
// or
public class MyClass(int i)
{
public int j => i;
}
Дополнительные примеры
В следующих примерах показаны различные сценарии, в которых происходит CS0236:
public class Examples
{
private string name = "Default";
// CS0236: Cannot reference instance field in initializer
private string displayName = name.ToUpper();
// CS0236: Cannot reference instance method in initializer
private int length = GetNameLength();
// CS0236: Cannot reference instance property in initializer
private string formatted = FormattedName;
public string FormattedName => $"Name: {name}";
private int GetNameLength() => name.Length;
public Examples()
{
// All of these work in the constructor:
displayName = name.ToUpper();
length = GetNameLength();
formatted = FormattedName;
}
}