这个if条件如何无法访问?

时间:2014-01-08 08:48:48

标签: c# .net visual-studio unreachable-code

IsSaveNewbool?的类型 CoverLetterId的类型为int?

if (coverLetter.IsSaveNew ?? true || coverLetter.CoverLetterId == null)

coverLetter.CoverLetterId == null。此声明在visual studio(2012)中标记为无法访问。

但如果IsSaveNew为假,则会达到第二个条件。为什么Visual Studio这么说?

4 个答案:

答案 0 :(得分:6)

看起来像是运营商优先问题。您的陈述评估为:

if (coverLetter.IsSaveNew ?? (true || coverLetter.CoverLetterId == null))

因此,||运算符的右侧操作数永远不会被计算,因为它的左侧操作数是文字true

您可以添加括号来解决此问题:

if ((coverLetter.IsSaveNew ?? true) || coverLetter.CoverLetterId == null)

答案 1 :(得分:3)

||的优先级高于??运算符。

查看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,这就是您的第二个操作数无法评估的原因。

来自|| Operator (C# Reference)

  

如果第一个操作数的计算结果为true,则第二个操作数不是   评价即可。如果第一个操作数的计算结果为false,则第二个操作数   operator确定OR表达式是否作为整体求值   是真还是假。

答案 2 :(得分:1)

你可以把封面信.IsSaveNew ??在括号中使用true 来解决此问题。 像 -

if ((coverLetter.IsSaveNew ?? true) || coverLetter.CoverLetterId == null)

答案 3 :(得分:0)

你最好使用GetValueOrDefault作为??部分将始终评估为真