C#中is not null检查无法让编译器识别值非空的问题咨询
问题原因与解决方案
你的问题出在字段的可空性检查无法被编译器做非空提升——因为字段可能被其他线程在is not null检查和赋值之间修改,编译器无法保证值依然非空,所以不会自动将Nullable<T>转换为T。
解决方法有两种:
- 使用空包容运算符
!,明确告诉编译器你确认此时值非空:
if (this.startingDate is not null) { startingDate = this.startingDate!; } else if (this.startingDateTime is not null) { startingDate = DateOnly.FromDateTime(this.startingDateTime!); }
- 先将字段赋值给局部变量,再对局部变量做检查——局部变量的状态不会被外部修改,编译器可以安全地做非空提升:
DateOnly startingDate; var localStartingDate = this.startingDate; var localStartingDateTime = this.startingDateTime; if (localStartingDate is not null) { startingDate = localStartingDate; } else if (localStartingDateTime is not null) { startingDate = DateOnly.FromDateTime(localStartingDateTime); } else { return false; }
关于is not null的意义
is not null绝非没用,它的价值体现在这些场景:
- 局部变量/参数的非空提升:如果是局部变量或者方法参数(尤其是nullable引用类型),编译器会自动识别
is not null后的非空状态,无需额外强制转换。 - 模式匹配增强:可以结合其他模式使用,比如
obj is not null and string str,一次性完成非空检查和类型转换,直接得到强类型变量。 - 语义更清晰:相比
!= null,在处理可空值类型、nullable引用类型时,is not null的语义更明确,避免一些边界场景下的歧义。
内容的提问来源于stack exchange,提问作者Takeshi Tokugawa YD
相关产品推荐
相关产品推荐

