You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 06:53:20