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

C#中对整数使用空原谅运算符为何不表现为NotNull?

问题解答

先明确核心问题:你混淆了空原谅运算符!在可空引用类型和**可空值类型(Nullable<T>)**上的作用差异。

对于你代码里的int?(也就是Nullable<int>),number1!并不会把它转换成int类型——它只是告诉编译器:“我保证这个变量此时不为null,别给我空值警告”,但变量本身的类型依然是int?。所以你试图把int?赋值给int,自然会出现类型不匹配的编译错误。

如果你的需求是:允许number1为null时抛出异常,同时不想用??这种默认值写法,正确的做法是直接访问Nullable<T>的.Value属性:

int? number1;//Nullable variable
int number2;//Not nullable variable

//After a while
number1 = 100;

number2 = number1.Value + 1;

当number1为null时,访问.Value会直接抛出InvalidOperationException,完全符合你“null就抛异常”的逻辑。此外你也可以用强制类型转换(int)number1,效果和.Value一致,但.Value的语义更清晰,一眼就能看出是在获取可空值类型的底层值。

再补充下!的正确用法场景:

  • 针对可空引用类型(比如string?),!会让编译器把它当作非空引用类型处理,同时抑制空警告;
  • 针对可空值类型,!仅用于抑制编译器的空值分析警告,不会改变变量类型,也不会自动拆箱成非空值类型。

内容的提问来源于stack exchange,提问作者MarsPeople

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 02:01:10