Как узнать версию C# с помощью препроцессора?

Мой проект в режиме отладки содержит конструкции, которые поддерживают только C# 7.3. Но в режиме Release проект должен быть собран на C# 7.0 без конкретных строк кода.

Я знаю о некоторых стандартных символах препроцессора, таких как NET472 и NETSTANDARD2_0, но он используется для работы с разными стандартами и их версиями. И это бесполезно для условия языковой версии.

public static Expression<TDelegate> CreateExpression<TDelegate>()
    where TDelegate : Delegate // Work in 7.3 and above
{ ... }

Я ожидал некоторых трюков, таких как

#if CSharpVersion >= 7.3
   where TDelegate : Delegate
#endif

Теперь я использую это утверждение:

#if DEBUG
    where TDelegate : Delegate
#endif

Но это не сработает, если я поменяю языковые версии в свойствах проекта.


person groser    schedule 08.05.2019    source источник
comment
Каков вариант использования этого другого процесса компиляции? Почему бы не скомпилировать релиз и в 7.3?   -  person Lasse V. Karlsen    schedule 08.05.2019
comment
И чтобы ответить на ваш вопрос, для версии компилятора нет встроенных переменных. Вам придется управлять этим самостоятельно.   -  person Lasse V. Karlsen    schedule 08.05.2019
comment
C# не имеет препроцессора, директива #if была намеренно искажена, чтобы не допускать выражений. Они намеренно не хотели воссоздавать кошмар C и C++. Прагматично не менять языковую версию. Или определить CSharpVersion73 в свойствах проекта, чтобы вы могли заставить #if работать.   -  person Hans Passant    schedule 08.05.2019


Ответы (1)


Если вы используете определение DEBUG для выбора языковой версии, вы можете сделать это в файле .csproj:

<Project ..>

  <PropertyGroup>
    ...
    <LangVersion>7.0</LangVersion>
    <LangVersion Condition="'$(Configuration)' == 'Debug'">7.3</LangVersion>
    ...
  </PropertyGroup>

  ...

</Project>

Помните, что редактирование настроек проекта в пользовательском интерфейсе может изменить это.

person Paulo Morgado    schedule 08.05.2019
comment
Что ты имеешь в виду? VS уже автоматически сопоставил языковую версию и конфигурацию в файле .csproj. Я использую #if DEBUG для удаления нескольких строк кода в RELEASE, потому что C# 7.3 в данный момент используется только в отладке. Но этот трюк не сработает, если я изменю настройки конфигурации. - person groser; 08.05.2019
comment
И при этом в отладочной конфигурации языковая версия будет 7.3. В противном случае будет 7.0. Разве не этого ты хотел? - person Paulo Morgado; 08.05.2019
comment
Спасибо. Но я ожидал некоторых хитростей препроцессора, которые позволили бы мне работать с любой комбинацией языковой версии и конфигурации. Например, использование $"x={x}" и String.Format("x={0}", x) при компиляции в версиях 6.0(+) и 5.0(-) соответственно. - person groser; 08.05.2019
comment
Вы можете использовать только один компилятор для каждого проекта. - person Paulo Morgado; 09.05.2019