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

C#中is not null检查无法让编译器识别值非空的问题咨询

问题原因与解决方案

你的问题出在字段的可空性检查无法被编译器做非空提升——因为字段可能被其他线程在is not null检查和赋值之间修改,编译器无法保证值依然非空,所以不会自动将Nullable<T>转换为T。

解决方法有两种:

  1. 使用空包容运算符!,明确告诉编译器你确认此时值非空:
if (this.startingDate is not null)
{
    startingDate = this.startingDate!;
}
else if (this.startingDateTime is not null)
{
    startingDate = DateOnly.FromDateTime(this.startingDateTime!);
}
  1. 先将字段赋值给局部变量,再对局部变量做检查——局部变量的状态不会被外部修改,编译器可以安全地做非空提升:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 08:57:14