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
相关产品推荐
相关产品推荐

