【问题标题】:How this if condition is unreachable?如果条件不可达怎么办?
【发布时间】:2014-01-08 08:48:47
【问题描述】:

IsSaveNewbool? 的类型 CoverLetterIdint? 的类型

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    你可以加括号来解决这个问题:

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

    【讨论】:

    • 但视觉工作室仍然说它无法访问
    • @SubinJacob,您在构建过程中的输出窗格中是否有实际警告,或者只是 Intellisense 将表达式标记为无法访问?
    • 抱歉,这是智能感知的问题。当我编译时,它得到了纠正。谢谢
    【解决方案2】:

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

    查看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)

    如果第一个操作数的计算结果为真,则第二个操作数不是 评估。如果第一个操作数的计算结果为假,则第二个 运算符确定整个 OR 表达式是否计算为 真假。

    【讨论】:

    • 即使在添加 () 之后,警告仍然存在。但是,当传递 false 时,代码会完美执行
    • @SubinJacob 我认为您在 Visual Studio 中使用了一些插件。这意味着您的coverLetter.IsSaveNew ?? true 返回true。这可能意味着两件事:您的coverLetter.IsSaveNewisnull 您的coverLetter.IsSaveNewistrue
    【解决方案3】:

    你可以把 coverLetter.IsSaveNew ?? true 在括号中解决这个问题。 喜欢-

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2014-03-02
        • 1970-01-01
        • 1970-01-01
        • 2016-08-18
        • 1970-01-01
        • 2012-11-26
        • 2018-03-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多