Глядя на общеизвестную ошибку CS0236 сообщение
Ошибка (CS0236): инициализатор поля не может ссылаться на нестатическое поле, метод или свойство и
причина для такого ограничения - порядок инициализации:
Нельзя использовать переменную экземпляра для инициализации другой переменной экземпляра.
Но this
не является переменной экземпляра, не так ли? У меня вопрос, почему существует такое строгое требование даже для рефренирования класса методов ? В моем понимании было бы достаточно ограничить только вызов методов класса, например:
bool _field;
bool GetField() => _field;
bool _field2 => GetField(); // clearly an error, invoking something that might not be initialized
// why compiler cannot safely bind a delegate? It does not have to access anything, just take an address
Func<bool> Func1 = GetField; // does not have to error, refencing but not invoking
Это просто проектное решение или существуют какие-либо технические ограничения, которые препятствуют привязке делегата во время поляинициализация?
Редактировать: меня интересуют технические аспекты, а не исправление ошибок. Что мешает компилятору привязать метод экземпляра? Адрес this
должен быть доступен в тот момент, когда происходит связывание, и что-то вроде funcPtr = instanceaddress+memberoffset
, похоже, не имеет побочных эффектов при инициализации.