C#中?.运算符与!运算符的区别是什么?
C# 中
?. 和 ! 运算符的区别 结合Prop1是int类型的前提,两段代码的核心区别如下:
第一段代码:var c = foo?.Prop1;
- 这是空条件运算符,核心作用是安全防null:
- 运行时会先检查
foo是否为null:如果foo不为null,就正常获取Prop1的int值;如果foo是null,整个表达式直接返回null。 - 因为
Prop1是值类型int,变量c的类型会被自动推导为int?(可空int类型),允许存储null值。 - 无论
foo是否为null,这段代码都不会抛出NullReferenceException。
- 运行时会先检查
第二段代码:var c = foo!.Prop1;
- 这是空包容运算符,核心作用是给编译器“打保票”:
- 它完全不做运行时的null检查,仅告诉编译器:“我确认
foo绝对不是null,不用给我报null相关警告”。 - 变量
c的类型会被推导为普通的int,因为编译器被强制认定foo非空,直接取Prop1的int值。 - 如果运行时
foo实际为null,这段代码会直接抛出NullReferenceException,因为没有任何安全校验。
- 它完全不做运行时的null检查,仅告诉编译器:“我确认
内容的提问来源于stack exchange,提问作者Alp
相关产品推荐
相关产品推荐

