更新到VS16.9.0后:C#7.3中不提供“仅初始化设置器”功能。请使用9.0或更高版本的语言

c#

我们有一个面向目标的项目,netstandard2.0该项目使用 NuGet 包CsvHelper,该包也可作为netstandard2.0.

该项目包含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 中的错误?因为在 VS 16.8.6 中它编译得很好,而在 VS 16.9.0 中它失败了。

我知道,一个简单的解决方法是<LangVersion>在我们的 .csproj 文件中添加一个条目,但这是推荐的方法吗?

回答

这看起来是库中一个不明智的重大更改,该更改是在 1 月底添加的,并且已经被还原。从setto更改init是一个根本性的重大更改,它引入了modreq只有在最近的 C# 版本中才能理解的a 。

这是奇怪的,它会编译VS 16.8.6,和诚实:我觉得这不太可能-它应该会失败,但约一个未知的错误消息modreq(而不是失败,但不知为什么)。我怀疑更有可能的是您还将库版本更新为引入问题的 1 月后版本,而您现在看到了失败。

修复:

  1. 恢复到 1 月底之前尚未进行重大更改的版本
  2. 更新到恢复后的新版本,即不具有重大更改任何更多
  3. 使用<LangVersion>中的csproj选择更近的C#版本; 由于您使用的编译器知道具体问题是什么,您肯定有一个兼容的编译器 - 它只是被限制为低级 C# 功能

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


以上是更新到VS16.9.0后:C#7.3中不提供“仅初始化设置器”功能。请使用9.0或更高版本的语言的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>