Null-coalescing out 参数不会给出错误

Null-coalescing out parameter doesnt give error

提问人:Eugene Pavlyuk 提问时间:6/20/2023 最后编辑:Eugene Pavlyuk 更新时间:6/20/2023 访问量:66

问:

本问题介绍与使用 Null-coalescing、Null-conditional 和 out 参数相关的错误: Null-coalescing out 参数给出意外警告 答案详细说明了此错误的原因。

但是当我将示例从问题复制到我的项目时,我没有收到错误,并且一切都会编译。我遇到了这样一个事实,即该项目是在我的计算机上编译的,但其他人有问题。这取决于环境吗?什么环境?

项目使用 .net5 和 С#8.0。我尝试了 VS2022、Rider 和控制台 msbuild 作为编译器,它们都编译成功。

c# 输出 空合并

评论

0赞 Charlieface 6/20/2023
您是否打开或关闭了可为 null 的上下文?
0赞 Dai 6/20/2023
如果使用的是 .NET 5,则不会使用 C# 8.0 - .NET 5 与 C# 9.0 相关联。MSBuiild 将提升您的语言版本以匹配当前的 .NET 版本目标 - 而 IIRC 它将忽略任何通过您的 ..csproj
0赞 Jeroen Mostert 6/20/2023
@Dai:MSBuild 尊重你自己显式输入的内容,而不管你的 .NET 版本如何,也不管它是否有效。如果您愿意,可以将 C# 11 与 .NET 4.8 一起使用,只要不使用需要运行时和/或库支持的功能,它就可以工作。LangVersion
0赞 Eugene Pavlyuk 6/20/2023
我的 .csproj 文件没有 <Nullable> 元素,因此它处于默认设置。
0赞 Eugene Pavlyuk 6/20/2023
我尝试创建新的控制台解决方案,问题中的代码仍然对我有用,因此 lang 版本无关紧要。

答:

1赞 shingo 6/20/2023 #1

分析器已在 C#10 中针对类似表达式进行了改进,您可以查看这些链接了解详细信息。

[建议]:改进确定分配分析

改进的确定分配

如果使用旧编译器,则错误是可重现的。这是 SharpLab 上的一个示例

1赞 Guru Stron 6/20/2023 #2

您似乎安装了更高版本的编译器(与您的同事机器相比)。从“选择要使用的 .NET 版本”文档中:

SDK 使用最新安装的版本

C# 10 实现了改进的确定赋值分析,这似乎解决了链接问题中的问题(查看示例)。

尝试将global.json文件添加到项目根目录,以设置用于编译项目的 SDK。像这样:

{
  "sdk": {
    "version": "5.0.0",
    "rollForward": "latestMinor"
  }
}

然后再次尝试编译(我目前的猜测是它应该会导致错误,另一件事要检查 - 安装在同事机器上的 .NET SDK - 使用 ,理论上此检查可以向后移植到 .NET 5 SDK)。dotnet --list-sdks

评论

0赞 Eugene Pavlyuk 6/20/2023
这意味着我从 C# 10 中获得了“改进的确定赋值分析”,但没有获得其他新功能,例如“非”模式?这对我不起作用。
0赞 Guru Stron 6/20/2023
@EugenePavlyuk基本上是的。它需要对编译器有更深入的了解,但分析可以实现为与语言版本无关,而模式需要特定的语言版本集。实际上,您可以尝试使用.NET版本设置比支持的语言版本更高的语言版本,并且一些较新的语言内容将起作用(如果存在较新的编译器)。