Угловой случай в использовании выражения лямбд в основном конструкторе

Можно использовать #defines для помощи со сценариями модульного теста и отладкой. Например, создайте специальные варианты входа функций памяти и создайте специальный memlog_preinclude.h:

#define malloc memlog_malloc
#define calloc memlog calloc
#define free memlog_free

Компиляция Вы кодируете использование:

gcc -Imemlog_preinclude.h ...

ссылка в Вашем memlog.o к заключительному изображению. Вы теперь управляете malloc, и т.д., возможно, для входа целей, или моделировать отказы выделения для модульных тестов.

6
задан Olmo 9 December 2009 в 18:46
поделиться

4 ответа

Как правильно указывает Асгерхаллас, это не должно быть законным согласно спецификации. Мы случайно позволили этому фальшивому использованию проскользнуть с помощью детектора ошибок, который ищет неправильные употребления слова this, прежде чем это станет законным. Я исправил ошибку; компилятор C # 4 правильно помечает вашу программу как ошибку.

Приносим извинения за неудобства; это была моя ошибка.

22
ответ дан 8 December 2019 в 02:35
поделиться

Спецификация C # в 7.5.7 гласит: «Доступ this разрешен только в блоке конструктора экземпляра, метода экземпляра или средства доступа к экземпляру».

И даже более прямо в 10.11.1: «Инициализатор конструктора экземпляра не может получить доступ к создаваемому экземпляру. Поэтому ссылка на это в выражении аргумента инициализатора конструктора является ошибкой времени компиляции, так же как и ошибка времени компиляции для аргумента выражение для ссылки на любой член экземпляра через простое имя. "

Хотя экземпляр был создан в соответствии с 7.5.10.

Хмм. На самом деле это довольно странно. Я не видел ошибок времени компиляции.

6
ответ дан 8 December 2019 в 02:35
поделиться

Думаю, вы правы. Подкласс еще не создается, когда вызывается конструктор базового класса, и поэтому доступ к членам подкласса дает вам нулевую ссылку. У CLR нет способа узнать во время компиляции, существует экземпляр или нет.

Перемещение логики в тело конструктора должно решить проблему.

4
ответ дан 8 December 2019 в 02:35
поделиться

Лямбда захватила значение «this» и зафиксировала значение null, поскольку объект еще не был создан. Это кажется мне ошибкой компилятора, она должна была вызвать ошибку. Такой код обычно генерирует CS0027 (ключевое слово this недоступно в текущем контексте) или CS0120 (требуется ссылка на объект). Бьюсь об заклад, это нелегко реализовать.

В любом случае, код не может работать. Классу NameRenderer требуется конструктор со строковым аргументом, чтобы он мог инициализировать базовый класс.

2
ответ дан 8 December 2019 в 02:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: