在if子句中验证空查询

时间:2018-04-30 19:37:24

标签: c# linq

我有一个简单的Linq查询和一个if...else条件,如:

var incidenciaPronosticada = _c.IncidenciaPronosticadas
    .Where( x => x.IdIncidenciaPronosticada == item.IdIncidenciaPronosticada )
    .FirstOrDefault();

if( incidenciaPronosticada.IdIncidenciaPronosticada != 0 || incidenciaPronosticada.IdIncidenciaPronosticada != null )
{
    //code there
}
else {
    //code there
}

问题是当incidenciaPronosticada为空时它不执行else子句,它只是停止

  

incidenciaPronosticada.IdIncidenciaPronosticada =   'incidenciaPronosticada.IdIncidenciaPronosticada'引发了一个例外   类型为'System.NullReferenceException'

为何不阅读incidenciaPronosticada.IdIncidenciaPronosticada != null?如果调试器读取它应该传递给else子句no?或者我做错了什么?此致

2 个答案:

答案 0 :(得分:4)

incidenciaPronosticada本身可以为空,这意味着incidenciaPronosticada.IdIncidenciaPronosticada != 0会导致NullReferenceExecption,因为无法访问IdIncidenciaPronosticada

执行显式空检查或使用空安全导航操作符?.

if( incidenciaPronosticada != null && incidenciaPronosticada.IdIncidenciaPronosticada != 0 ) {

或:

if( incidenciaPronosticada?.IdIncidenciaPronosticada > 0 ) {

(注意我使用的是> 0而不是!= 0,因为如果> 0为空(true),incidenciaPronosticada将为(Int32?)null != (Int32?)0:< / p>

另请注意,incidenciaPronosticada?.IdIncidenciaPronosticada表达式的类型为Nullable<Int32>(又名Int32?),而非Int32

以下是if( incidenciaPronosticada.IdIncidenciaPronosticada ... )

的结果表
incidenciaPronosticada      IdIncidenciaPronosticada    . != 0    . > 0
null                        null                        throws    throws
(object)                    null                        true      false
(object)                    0                           false     false
(object)                    1                           true      true

以下是if( incidenciaPronosticada?.IdIncidenciaPronosticada ... )

的结果表
incidenciaPronosticada      IdIncidenciaPronosticada    ?. != 0   ?. > 0
null                        null                        true      false
(object)                    null                        true      false
(object)                    0                           false     false
(object)                    1                           true      true

答案 1 :(得分:1)

您正在尝试访问incidenciaPronosticada内的成员。您的空检查应该类似于

if(incidenciaPronosticada != null)
{
//code there
}
else {
//code there
}