Директива компилятора для определения типов ссылок C# 8 / nullable - PullRequest
2 голосов
/ 09 апреля 2020

Существует ли директива компилятора для C# 8 или обнаружение, если установлена ​​<nullable>enable</nullable>?

У меня есть пакет Nuget только с исходным кодом, который может помочь с историей обнуляемых ссылочных типов. Я хотел бы условно установить директиву #nullable enable, если она установлена, например:

#ifdef ICANHASNULLABLE
#nullable enable
#endif

и

#ifdef ICANHASNULLABLE
string Foo(string? val)
#else
string Foo(string val)
#endif

У меня есть смесь, созданная с помощью. NET Core 2.1 SDK, и я работаю над тем, чтобы привести его в состояние. NET Core 3.1, хотя и медленно, а не просто щелкая переключателем. Директива указывает только на версии платформы, а не на языковую версию.

1 Ответ

3 голосов
/ 09 апреля 2020

Предположим, у вас есть приложение с несколькими таргетингами. В вашем .csproj файле:

<PropertyGroup>
    <TargetFrameworks>netcoreapp2.2;netcoreapp3.1</TargetFrameworks>
</PropertyGroup>

Вы можете добавить условное PropertyGroup спецификацию c к netcoreapp3.1 и задать собственную константу:

<PropertyGroup Condition="'$(TargetFramework)'=='netcoreapp3.1'">
    <DefineConstants>ICANHASNULLABLE</DefineConstants>
    <Nullable>enable</Nullable>
</PropertyGroup>

Вы можете также определите вашу директиву на основе <Nullable>:

<PropertyGroup Condition="'$(Nullable)'=='enable'">
    <DefineConstants>ICANHASNULLABLE</DefineConstants>
</PropertyGroup>

В своем коде вы можете использовать ICANHASNULLABLE:

#if ICANHASNULLABLE
void Foo(string? val)
#else
void Foo(string val)
#endif
{
}

Версия языка по умолчанию для netcoreapp 3.x C# 8,0 . Таким образом, любой PropertyGroup, специально определенный для netcoreapp3.1 в вышеприведенном примере, может рассматриваться как указанный от c до C# 8.0, если LangVersion не установлен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...