如何解决更新到 VS 16.9.0 后:C# 7.3 中不提供“仅初始化设置器”功能请使用 9.0 或更高版本的语言
我们有一个以 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 中它失败了。
我知道,一个简单的解决方法是在我们的 .csproj 文件中添加一个 <LangVersion>
条目,但这是推荐的方法吗?
解决方法
这看起来是库中一个不明智的重大更改,即 added at the end of January 和 already been reverted。从 set
更改为 init
是一个根本性的突破性更改,它引入了一个 modreq
,它只能在最近的 C# 版本中理解。
奇怪它会在 VS 16.8.6 中编译,老实说:我觉得这不太可能 - 它应该失败,但会出现关于未知的错误消息modreq
(与失败但知道原因相反)。我怀疑更可能是您还将库版本更新到了引入问题的 1 月之后的版本,而您现在看到了失败。
修复:
- 在 1 月底之前恢复到尚未进行重大更改的版本
- 恢复后更新到更新的版本,没有破坏性的变化更多
- 在 csproj 中使用
<LangVersion>
选择更新的 C# 版本;由于您使用的编译器知道具体问题是什么,您肯定有一个兼容的编译器 - 它只是限制使用低级 C# 功能
最终,modreq
(相对于 modopt
)的全部意义在于编译器必须理解 modreq
才能使用类型/成员,但是如果编译器不理解它的含义,它可以默默地忽略 modopt
。我发现旧版本的 C# 编译器不太可能会愉快地忽略它不理解的 modreq
。
我不能告诉你为什么它以前有效,但根据这个 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(因为它以前有效),但我认为您不会走得太远。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。