更新到 VS 16.9.0 后:功能 'init-only setters' 在 C# 7.3 中不可用。请使用9.0或更高版本的语言
After update to VS 16.9.0: Feature 'init-only setters' is not available in C# 7.3. Please use language version 9.0 or greater
我们有一个针对 netstandard2.0
的项目,该项目使用 NuGet 包 CsvHelper,也可以作为 netstandard2.0
.
使用
此项目包含 class CsvConfiguration
构建为:
public class CsvConfiguration
{
public virtual string Delimiter { get; init; }
}
而且我们过去使用这个库没有任何问题。将 Visual Studio 从 16.8.6 更新到 16.9.0 后,构建时会出现上述错误消息:
error CS8370: Feature 'init-only setters' is not available in C# 7.3. Please use language version 9.0 or greater.
虽然我理解为什么会发生此错误,但如果我在自己的代码中使用此功能,我不知道如果第三方库使用它时会发生这种情况,该库声明为与我的框架版本匹配。
这是库中还是 Visual Studio 中的 bug?因为在 VS 16.8.6 中编译正常,在 VS 16.9.0 中编译失败。
我知道,简单 解决方法是在我们的 .csproj 文件中添加一个 <LangVersion>
条目,但这是推荐的方法吗?
我不能告诉你为什么它以前有效,但根据这个 https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/configure-language-version 页面,.Net Standard 2.0 与 C 捆绑在一起#7.3(错误消息也适用)。 C#9 仅适用于 .Net 5.
您可以尝试将此作为错误报告给 Microsoft(因为它以前有效),但我认为您不会走得太远。
这看起来是库中一个不明智的重大更改,即 added at the end of January and which has already been reverted。从 set
更改为 init
是一项根本性的突破性更改,它引入了一个 modreq
,只有在最近的 C# 版本中才能理解。
它会在 VS 16.8.6 中编译 奇怪 ,老实说:我发现这不太可能 - 它 应该 失败,但有一条关于未知 modreq
的错误消息(与失败但知道原因相反)。我怀疑更 可能 是您还将库版本更新为引入问题的 post-1 月版本,现在您看到了失败。
修复:
- 恢复到 1 月底之前还没有重大更改的版本
- 还原后更新到较新的版本,不再有重大更改
- 在 csproj 中使用
<LangVersion>
选择较新的 C# 版本;由于您使用的编译器 知道具体问题是什么 ,您肯定有一个兼容的编译器 - 它只是被 限制 到下层C# 特性
最终,modreq
(与 modopt
相对)的全部要点是编译器 必须 理解要使用的 modreq
a type/member,但如果编译器不理解它的含义,它可以默默地忽略 a modopt
。我发现旧版本的 C# 编译器不太可能愉快地忽略它不理解的 modreq
。
我们有一个针对 netstandard2.0
的项目,该项目使用 NuGet 包 CsvHelper,也可以作为 netstandard2.0
.
此项目包含 class CsvConfiguration
构建为:
public class CsvConfiguration
{
public virtual string Delimiter { get; init; }
}
而且我们过去使用这个库没有任何问题。将 Visual Studio 从 16.8.6 更新到 16.9.0 后,构建时会出现上述错误消息:
error CS8370: Feature 'init-only setters' is not available in C# 7.3. Please use language version 9.0 or greater.
虽然我理解为什么会发生此错误,但如果我在自己的代码中使用此功能,我不知道如果第三方库使用它时会发生这种情况,该库声明为与我的框架版本匹配。
这是库中还是 Visual Studio 中的 bug?因为在 VS 16.8.6 中编译正常,在 VS 16.9.0 中编译失败。
我知道,简单 解决方法是在我们的 .csproj 文件中添加一个 <LangVersion>
条目,但这是推荐的方法吗?
我不能告诉你为什么它以前有效,但根据这个 https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/configure-language-version 页面,.Net Standard 2.0 与 C 捆绑在一起#7.3(错误消息也适用)。 C#9 仅适用于 .Net 5.
您可以尝试将此作为错误报告给 Microsoft(因为它以前有效),但我认为您不会走得太远。
这看起来是库中一个不明智的重大更改,即 added at the end of January and which has already been reverted。从 set
更改为 init
是一项根本性的突破性更改,它引入了一个 modreq
,只有在最近的 C# 版本中才能理解。
它会在 VS 16.8.6 中编译 奇怪 ,老实说:我发现这不太可能 - 它 应该 失败,但有一条关于未知 modreq
的错误消息(与失败但知道原因相反)。我怀疑更 可能 是您还将库版本更新为引入问题的 post-1 月版本,现在您看到了失败。
修复:
- 恢复到 1 月底之前还没有重大更改的版本
- 还原后更新到较新的版本,不再有重大更改
- 在 csproj 中使用
<LangVersion>
选择较新的 C# 版本;由于您使用的编译器 知道具体问题是什么 ,您肯定有一个兼容的编译器 - 它只是被 限制 到下层C# 特性
最终,modreq
(与 modopt
相对)的全部要点是编译器 必须 理解要使用的 modreq
a type/member,但如果编译器不理解它的含义,它可以默默地忽略 a modopt
。我发现旧版本的 C# 编译器不太可能愉快地忽略它不理解的 modreq
。