C#可空性分析:悬停提示与编译器处理不一致问题咨询
C#可空性悬停提示与编译器处理不一致问题
我在Visual Studio和代码在线运行平台中发现一个奇怪的现象:变量的悬停可空性提示,和编译器实际对该变量的可空性处理存在不一致。想确认是自己忽略了某些细节,还是这属于C#编译器/Roslyn的Bug。
代码示例
#nullable enable using System; using System.Collections.Generic; using System.Linq; public sealed class RectangleInfo { } public sealed class PreviewLayout { public sealed class Builder { public Builder() { this.Screens = new(); } public List<RectangleInfo> Screens { get; set; } public PreviewLayout Build() { return new PreviewLayout(); } } } public static class LayoutHelper { public static PreviewLayout GetPreviewLayout() { var builder = new PreviewLayout.Builder(); var screen = builder.Screens.Single(); Console.WriteLine(screen.GetType().FullName); return builder.Build(); } }
具体现象
- 把鼠标悬停在
var screen = builder.Screens.Single();中的screen变量上时,工具提示显示:(local variable) RectangleInfo? screen
这里要注意,Single()明明返回的是非可空的RectangleInfo,而且代码中也没有其他可空性相关的警告或错误。 - 但在后续代码
screen.GetType().FullName中,编译器却将screen视为非空,没有弹出Dereference of a possibly null reference.的警告。 - 即使把
var screen = ...中的var替换成显式的RectangleInfo,悬停提示依然显示RectangleInfo? screen。
这个问题在Visual Studio中同样存在,推测根源在C#编译器/Roslyn。请问是我遗漏了某些可空性规则细节,导致screen理应被标记为可空类型RectangleInfo?,还是这确实是一个Bug?
内容的提问来源于stack exchange,提问作者mclayton
相关产品推荐
相关产品推荐

