IsSaveNew
是类型bool?
CoverLetterId
是类型int?
if (coverLetter.IsSaveNew ?? true || coverLetter.CoverLetterId == null)
coverLetter.CoverLetterId == null
. 此语句在 Visual Studio(2012) 中被标记为不可访问。
但如果IsSaveNew
是假的,那么它将达到第二个条件。为什么 Visual Studio 这么说?
IsSaveNew
是类型bool?
CoverLetterId
是类型int?
if (coverLetter.IsSaveNew ?? true || coverLetter.CoverLetterId == null)
coverLetter.CoverLetterId == null
. 此语句在 Visual Studio(2012) 中被标记为不可访问。
但如果IsSaveNew
是假的,那么它将达到第二个条件。为什么 Visual Studio 这么说?
看起来像运算符优先级问题。您的陈述被评估为:
if (coverLetter.IsSaveNew ?? (true || coverLetter.CoverLetterId == null))
因此,运算符的右侧操作数||
永远不会被计算,因为它的左侧操作数是文字true
。
您可以添加括号来解决此问题:
if ((coverLetter.IsSaveNew ?? true) || coverLetter.CoverLetterId == null)
查看7.2.1 Operator precedence and associativity
你的true || coverLetter.CoverLetterId == null
作品先。如果你想coverLetter.IsSaveNew ?? true
先工作,只需在它周围使用括号。
像;
if ((coverLetter.IsSaveNew ?? true) || coverLetter.CoverLetterId == null)
但是视觉工作室仍然说它无法访问
这意味着(可能)你的coverLetter.IsSaveNew ?? true
回报true
,这就是你的第二个操作数不评估的原因。
如果第一个操作数的计算结果为 true,则不计算第二个操作数。如果第一个操作数的计算结果为 false,则第二个运算符确定整个 OR 表达式的计算结果为 true 还是 false。
你可以把coverLetter.IsSaveNew ?? 在括号中为true以解决此问题。像-
if ((coverLetter.IsSaveNew ?? true) || coverLetter.CoverLetterId == null)
您最好使用 GetValueOrDefault 作为 ?? 部分将始终评估为真