Почему компилятор C # не может связать экземпляр Delegate во время инициализации поля? - PullRequest
1 голос
/ 08 ноября 2019

Глядя на общеизвестную ошибку 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, похоже, не имеет побочных эффектов при инициализации.

...