Можно использовать #defines для помощи со сценариями модульного теста и отладкой. Например, создайте специальные варианты входа функций памяти и создайте специальный memlog_preinclude.h:
#define malloc memlog_malloc
#define calloc memlog calloc
#define free memlog_free
Компиляция Вы кодируете использование:
gcc -Imemlog_preinclude.h ...
ссылка в Вашем memlog.o к заключительному изображению. Вы теперь управляете malloc, и т.д., возможно, для входа целей, или моделировать отказы выделения для модульных тестов.
Как правильно указывает Асгерхаллас, это не должно быть законным согласно спецификации. Мы случайно позволили этому фальшивому использованию проскользнуть с помощью детектора ошибок, который ищет неправильные употребления слова this, прежде чем это станет законным. Я исправил ошибку; компилятор C # 4 правильно помечает вашу программу как ошибку.
Приносим извинения за неудобства; это была моя ошибка.
Спецификация C # в 7.5.7 гласит: «Доступ this разрешен только в блоке конструктора экземпляра, метода экземпляра или средства доступа к экземпляру».
И даже более прямо в 10.11.1: «Инициализатор конструктора экземпляра не может получить доступ к создаваемому экземпляру. Поэтому ссылка на это в выражении аргумента инициализатора конструктора является ошибкой времени компиляции, так же как и ошибка времени компиляции для аргумента выражение для ссылки на любой член экземпляра через простое имя. "
Хотя экземпляр был создан в соответствии с 7.5.10.
Хмм. На самом деле это довольно странно. Я не видел ошибок времени компиляции.
Думаю, вы правы. Подкласс еще не создается, когда вызывается конструктор базового класса, и поэтому доступ к членам подкласса дает вам нулевую ссылку. У CLR нет способа узнать во время компиляции, существует экземпляр или нет.
Перемещение логики в тело конструктора должно решить проблему.
Лямбда захватила значение «this» и зафиксировала значение null, поскольку объект еще не был создан. Это кажется мне ошибкой компилятора, она должна была вызвать ошибку. Такой код обычно генерирует CS0027 (ключевое слово this недоступно в текущем контексте) или CS0120 (требуется ссылка на объект). Бьюсь об заклад, это нелегко реализовать.
В любом случае, код не может работать. Классу NameRenderer требуется конструктор со строковым аргументом, чтобы он мог инициализировать базовый класс.