如果为null,null条件运算符是否返回false?

时间:2017-07-11 16:22:20

标签: c# nullreferenceexception c#-6.0 null-coalescing-operator

我有这个条件

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

我相信如果item为null,?.操作将返回null,我认为这将被解析为false导致条件短路并且一切都会很好(item.get_Value()将不会被召唤)

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

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

但我认为这可能是矫枉过正,是否可以避免潜在的空引用异常?

2 个答案:

答案 0 :(得分:5)

如果item?.Value2?.GetType()nullitemnull

Value2将返回null

评估的条件将是

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

所以第一个条件将被解析为true,导致NullReferenceException执行item.get_Value() == 0时(但仅当itemnull时才会Value2

答案 1 :(得分:1)

.Value2速度更快,但对于格式化为日期或货币的单元格,.Value2会返回Double,但.Value.get_Value()会返回DateTime和Decimal。如果单元格是数字类型,则两者都会生成Double;如果值不是数字类型或格式化为文本的数字,则两者都会生成String。对于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的最短且最安全的方法。 (如果是枚举范围的结果,则item不为null)

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

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