null 条件运算符 return 如果为 null 是否为 false?

Does null conditional operator return false if null?

我有这个条件

if (item?.Value2?.GetType() != typeof(string) && item.get_Value() == 0)

我相信如果项目为空,?. 操作将 return 为空,我相信这将被解决为 false 导致条件短路,一切都会好起来的(item.get_Value()不会被调用)

不过我不确定,我想也许我需要这样做

if (item?.Value2?.GetType() ?? 0 != typeof(string) && item.get_Value() == 0)

但我认为这可能有点矫枉过正,第一种方法是否可以避免潜在的空引用异常?

item?.Value2?.GetType() 将 return null 如果 itemnullValue2null.

评估的条件将是

if (null != typeof(string) && item.get_Value() == 0)

所以第一个条件将被解析为 true 导致 NullReferenceExceptionitem.get_Value() == 0 将被执行时(但仅当 itemnull 时,而不是 Value2)

.Value2 更快,但对于格式为日期或货币的单元格,.Value2 returns Double,但 .Value.get_Value() return 日期时间和十进制。如果单元格是数字类型,则两者都会产生 Double,如果值不是数字类型或格式化为文本的数字,则会产生 String。 return 类型也可以是 Boolean 表示 TRUE 和 FALSE,Integer 表示错误。


if (0.0.Equals(item.Value2)) // if (item.Value2 is Double && (Double)(item.Value2) == 0.0) 

这可能看起来很奇怪,但这是检查 运行 时间 type is Double and equal 是否为 0.0 的最短和最安全的方法。 (如果是枚举Range的结果,item不为null)


至于实际问题,找到第0个单元格:

Range cell = range.Find(0, LookAt: XlLookAt.xlWhole);
if (cell != null) { /* ... */ }