Новая функция, необходимая для С# 11, имеет ошибку компиляции в многоцелевом проекте, включая net7,net472.

Среда: vs 2022 v 17.4.0, с установленным NET7 sdk

У меня многоцелевой проектnet7.0;net472:

      <PropertyGroup>
        <OutputType>Exe</OutputType>
        <TargetFrameworks>net7.0;net472</TargetFrameworks>      
        <LangVersion>11.0</LangVersion>
        <!--others-->
    </PropertyGroup>

Я попытался использовать новую функцию, необходимую в С# 11, как показано ниже:

      public class Person
    {
        public required int Id { get; set; }
       
    }

Я получаю ошибку компиляции в net472:

Ошибка CS0656 Отсутствует обязательный член компилятора «System.Runtime.CompilerServices.CompilerFeatureRequiredAttribute..ctor»
Ошибка CS0656 Отсутствует обязательный член компилятора «System.Runtime.CompilerServices.RequiredMemberAttribute..ctor»

Мое обходное решение использует условную компиляцию как:

       public class Person
    {
       
        public
#if NET7_0
            required
#endif
            int Id { get; set; }
    }

Что мне делать, чтобы поддерживать новые функции, необходимые для С# 11 в многоцелевом проекте с net47x?

2 ответа

Как и в случае с некоторыми новыми функциями языка в старых версиях C#, это будет работать, если вы создадите отсутствующие атрибуты самостоятельно. Дляrequiredключевое слово, вам понадобятся эти атрибуты:

Но поскольку это официально не поддерживается, могут возникнуть проблемы либо сейчас, либо в будущем.

Вы можете использовать пакет PolySharp , чтобы получить эти (и другие) классы в своих проектах.

Функции языка С# 11 определенно не поддерживаются в Framework 4.7.2, из этой таблицы: https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/configure-language-version показывает язык по умолчанию Версия для NET Framework была C# 7.3, и у этого SO-ответа C# 8 начались проблемы. Функции C# 8 в .NET Framework 4.7.2 Как указано в последней ссылке, некоторые функции могли быть включены, но официально не поддерживались.

Если вам абсолютно необходимо работать с несколькими целевыми объектами, вы должны либо выполнить условную компиляцию, либо помнить о том, какие языковые функции вы используете, ограничиваясь C# 7.3. Вы можете попробовать обновиться до NET Framework 4.8, но я думаю, что максимум, что вы получите, это поддержка C#8.

Другие вопросы по тегам