1

IsSaveNew是类型bool? CoverLetterId是类型int?

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

coverLetter.CoverLetterId == null. 此语句在 Visual Studio(2012) 中被标记为不可访问。

但如果IsSaveNew是假的,那么它将达到第二个条件。为什么 Visual Studio 这么说?

4

4 回答 4

6

看起来像运算符优先级问题。您的陈述被评估为:

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

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

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

if ((coverLetter.IsSaveNew ?? true) || coverLetter.CoverLetterId == null)
于 2014-01-08T08:51:21.457 回答
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,则第二个运算符确定整个 OR 表达式的计算结果为 true 还是 false。

于 2014-01-08T08:53:17.753 回答
1

你可以把coverLetter.IsSaveNew ?? 在括号中为true以解决此问题。像-

if ((coverLetter.IsSaveNew ?? true) || coverLetter.CoverLetterId == null)
于 2014-01-08T08:53:29.743 回答
0

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

于 2014-01-08T08:52:46.697 回答