Visual Studio игнорирует код внутри области #if DEBUG/RELEASE и не проверяет наличие ошибок или автозаполнения.

Я писал фрагмент кода #if DEBUG, #else, #endif и заметил, что Visual Studio не позволяет использовать автозаполнение для выполнения частично типизированных имен элементов и не проверяет неактивный код, выделенный серым цветом, на наличие ошибок. Единственный способ, который я нашел, чтобы снова позаботиться об этом, - это переключить режим сборки с Debug на Release. Но это неудобно и кажется, что есть лучший способ.

пример:

#if DEBUG
    throw;
#else
    throw new exc // I want to use autocomplete here but can't because it's greyed out
#endif

Как заставить VS перестать игнорировать другой код внутри другой области конфигурации #if DEBUG?


person user1306322    schedule 02.04.2018    source источник


Ответы (3)


Это цель условной компиляции, она работает по назначению. При условной компиляции приложение может игнорировать определенный код при компиляции. Ваше приложение в Visual Studio работает в режиме отладки, поэтому компилятор игнорирует код внутри #elsepart.

Запустите приложение в режиме Release, после чего #else код будет доступен, а #if DEBUG будет недоступен.

введите здесь описание изображения

Обновить


Для проверки #if DEBUG и #else вам нужно дважды запустить приложение.

1.Однажды в режиме отладки, в котором код с #if DEBUG похож на:

введите здесь описание изображения введите здесь описание изображения

здесь приложение находится в режиме отладки, поэтому код условия #if DEBUG активен..

  1. Запустите приложение в режиме выпуска для проверки кода в состоянии #else. Здесь другая часть также сможет использовать автозаполнение и отладку.

введите здесь описание изображения введите здесь описание изображения


Обратитесь к документам Microsoft для получения дополнительной информации об этом:

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/compiler-options/debug-compiler-option

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/compiler-options/listed-by-category

person Pranav Singh    schedule 02.04.2018
comment
Итак, я думаю, я хочу сделать это по-другому, если я хочу, чтобы мой код проверялся на наличие ошибок и разрешал автозаполнение. Ваш ответ объясняет, почему это происходит, но не объясняет, как я могу сделать то, что объяснил. - person user1306322; 02.04.2018
comment
Вы можете проверить код на наличие ошибок, но одновременно только #if в режиме отладки и другой код в #else в режиме выпуска. я обновляю ответ - person Pranav Singh; 02.04.2018
comment
Просто идея, удалите #if и #else для проверки кода и получения автозаполнения после тестирования кода, а автозаполнение используется для всего кода, снова поставьте #if и #else. - person Pranav Singh; 04.04.2018
comment
да, это в основном то, что я сделал, но комментируя вместо удаления - person user1306322; 04.04.2018

Я знаю, что это поздний ответ, но он актуален и по сей день.

TL;DR: this is a VS bug, который затрагивает только проекты netstandard/netcore (или, проще говоря, новый формат .csproj).

Обходной путь... противный! Reload the project file (или закройте и снова откройте VS).

Хорошая новость: это не влияет на компиляцию :)

Подробнее см. здесь и здесь.

person Joel    schedule 06.03.2019

В начале файла определите обе константы:

#define DEBUG
#define RELEASE

Далее используйте два условия if вместо if/else.

#if DEBUG
            // autocomplete works
#endif
#if RELEASE
            // autocomplete works
#endif

Конечно, вы должны удалить/закомментировать эти определения перед компиляцией проекта.

На мой взгляд, это неудобно и чревато ошибками.

person Alexander Petrov    schedule 02.04.2018
comment
Я действительно ожидал, что будет флажок для принудительной обработки кода в неактивной области, но я полагаю, что цель всего этого противоречит моему желанию. - person user1306322; 02.04.2018