为什么if语句表达式不被视为条件?

Pio*_*nom 1 c# nullreferenceexception

我有一个组合框,里面有一个日期列表.我想确保用户实际选择日期.所以,我有以下几点:

        if (cmbDateSelecter.SelectedItem.ToString().ToLower().Contains("select") || 
            cmbDateSelecter.SelectedItem.ToString().ToLower().Contains("seleccione") || 
            cmbDateSelecter.SelectedItem == null)
Run Code Online (Sandbox Code Playgroud)

默认项目是"选择日期",所以我正在检查是否是所选项目.这曾经是自己工作的,由于某种原因,我还没想到,开始抛出NullReferenceExceptions.所以,我添加了空检查.但是,我仍然得到例外.但如果我这样做:

if(cmbDateSelecter.SelectedItem == null)

现在,我知道我可以先进行空检查,一切都会变得笨拙.我的问题是为什么在抛出异常之前不评估所有表达式?如果其中一个是真的,在我的表达式(作为空检查)的情况下,为什么它仍然抛出异常?

Jon*_*Jon 6

它不会在抛出之前评估所有条件,因为在C#(以及几乎所有其他编程语言中)逻辑OR运算符执行短路评估.即使它确实对它们进行了全部评估,它仍会抛出,因为评估前两个条件中的任何一个都涉及尝试访问空对象.所以这种行为不会提供解决方案.

但是,短路评估正是允许您通过null在开头移动检查来解决问题的原因:如果测试返回,true则编译器知道整个表达式将true跳过并跳过评估抛出的表达式.