在Nullable Context中使用null-conditional operator为何触发CS8602警告?
为什么用了null-conditional运算符后,非null变量会触发CS8602警告?
先看你的代码示例:
#nullable enable var test = new List<int>(); Console.WriteLine(test.Count); // 无警告 Console.WriteLine(test?.Count); Console.WriteLine(test.Count); // 触发CS8602:可能取消对空引用的引用
问题原因
C#的nullable静态分析有个规则:一旦你对某个变量使用了?.运算符,编译器会将该变量的可空状态标记为「可能为null」。哪怕你明知道这个变量从创建到现在根本没机会被赋值为null,但编译器的静态分析是基于语法特征的——它会认为,你既然用了?.,就意味着这个变量存在为null的可能性,后续再直接访问它的成员时,就会触发CS8602警告。
你的预期其实是合理的:这里的?.完全没必要,编译器应该提示你移除这个多余的空条件检查,而不是反过来警告后续的正常访问。但当前的nullable分析规则优先防范潜在的空引用风险,所以出现了这个看似矛盾的“误报”。
解决办法
- 最优方案:直接移除不必要的
?.
既然test是明确用new创建的非null实例,直接写test.Count就可以,完全不需要?.:#nullable enable var test = new List<int>(); Console.WriteLine(test.Count); Console.WriteLine(test.Count); Console.WriteLine(test.Count); - 临时绕开(不推荐):用
!抑制警告
如果出于某些原因必须保留?.,可以用空抑制运算符!告诉编译器「我确定这个变量不为null」:
但这种做法相当于手动关闭了编译器的空引用检查,不如直接移除Console.WriteLine(test!.Count);?.来得稳妥。
内容的提问来源于stack exchange,提问作者Sinatr
相关产品推荐
相关产品推荐

