更新到 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.0C 捆绑在一起#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. 恢复到 1 月底之前还没有重大更改的版本
  2. 还原后更新到较新的版本,不再有重大更改
  3. 在 csproj 中使用 <LangVersion> 选择较新的 C# 版本;由于您使用的编译器 知道具体问题是什么 ,您肯定有一个兼容的编译器 - 它只是被 限制 到下层C# 特性

最终,modreq(与 modopt 相对)的全部要点是编译器 必须 理解要使用的 modreq a type/member,但如果编译器不理解它的含义,它可以默默地忽略 a modopt。我发现旧版本的 C# 编译器不太可能愉快地忽略它不理解的 modreq