Новая функция, необходимая для С# 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
ключевое слово, вам понадобятся эти атрибуты:
- Обязательный атрибут члена
- CompilerFeatureRequiredAttribute
- IsExternalInit (для
init
ключевое слово вCompilerFeatureRequiredAttribute
)
Но поскольку это официально не поддерживается, могут возникнуть проблемы либо сейчас, либо в будущем.
Вы можете использовать пакет 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.