Концептуальная причина ошибки "инициализатор поля не может ссылаться на нестатическое поле, метод или свойство" CS0236
C# не инициализатор поля экземпляра ссылка другое поле. Например, этот код недопустим:
class A
{
string s1 = "";
string s2 = s1;
}
потому что "s2" ссылается на "s1".
но почему это не разрешается ?
моей первой мыслью было, что спецификации C# не гарантируйте никакого порядка инициализации, но в соответствии со спецификациями порядок является порядком объявления:
в инициализаторы переменных выполняются в текстовом порядке, в котором они отображаются в объявлении класса.
Итак, если порядок детерминирован, каковы могут быть подводные камни такого рода кода ?
заранее спасибо за вашу помощь.
EDIT:
согласно ответов Hps, 0xA3 и Петр :
порядок инициализация в сценарии наследования может быть очень запутанной,
реализация такой функции потребует некоторых ресурсов от команды разработчиков компилятора для небольшой выгоды,
невозможно использовать метод или свойства по логическим причинам (спасибо Петр), так по консистенции то же самое верно для полей.
3 ответов
Я не уверен в поле, но кажется рациональным запретить инициализаторам полей доступ к свойствам или методам. Например:
class A
{
string s1 = GetString();
string s2 = this.MyString;
string s3 = "test";
public string GetString()
{
// this method could use resources that haven't been initialized yet
}
public string MyString
{
get { return s3; }
// this field hasn't been initialized yet
// (okay, strings have a default value, but you get the picture)
}
}
компилятор, вероятно,может проверьте порядок полей, а затем разрешите инициализацию, если другое поле было ранее объявлено.
помимо ловушки, которая переупорядочивает или переструктурирует ваш код, почему компилятор должен быть излишне сложным. Ресурсы ограничены, и команда компилятора, вероятно, предпочитает работать над функциями с более высоким приоритетом.