Есть ли оператор C в условной компиляции C #? - PullRequest
1 голос
/ 30 октября 2019

В настоящее время я создаю сборку .NET, которая должна работать в .NET 4.5 и как минимум в двух версиях .NET Core (.NET Core 2.1 и .NET Core 3.0).

Я использую условную компиляцию, напримерИтак:

#if NET45
        //Use as System.Web.HttpContext
        isHttps = context.Request.IsSecureConnection;
        IPAddress fromIp = IPAddress.Parse(context.Request.UserHostAddress);
        string path = context.Request.Path;
#elif NETCOREAPP2_1
        //Use as Microsoft.AspNetCore.Http.HttpContext
        isHttps = context.Request.IsHttps;
        IPAddress fromIp = context.Request.HttpContext.Request.HttpContext.Connection.RemoteIpAddress;
        string path = context.Request.Path;
#elif NETCOREAPP3_0
        //Use as Microsoft.AspNetCore.Http.HttpContext
        isHttps = context.Request.IsHttps;
        IPAddress fromIp = context.Request.HttpContext.Request.HttpContext.Connection.RemoteIpAddress;
        string path = context.Request.Path;
#endif

Поскольку код для NETCOREAPP2_1 и NETCOREAPP3_0 одинаков, интересно, могу ли я использовать что-то вроде:

#if NET45
        //...
#elif NETCOREAPP2_1 [OR] NETCOREAPP3_0
        //...
#endif    

Однако этот синтаксис не работает.

Существует ли допустимый синтаксис для использования оператора OR в условной компиляции, подобной этой?

Примечание. Так как это включает конвейер запросов ASP.NET, я полагаю .NET Standardэто не вариант. Возможно, вы захотите взглянуть на код вовремя: https://github.com/suterma/SqlSyringe/blob/f7df15e2c40a591b8cea24389a1ba8282eb02f6c/SqlSyringe/Syringe.cs

1 Ответ

7 голосов
/ 30 октября 2019

Да, есть. Это то же самое, что и в стандартном if:

#if NET45
    // ...
#elif (NETCOREAPP2_1 || NETCOREAPP3_0)
    // ...
#endif

Подробнее здесь: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/preprocessor-directives/preprocessor-if

...