此Console.WriteLine语句中的错误在哪里?

时间:2009-08-21 14:05:51

标签: c# .net operator-precedence

如果您运行以下代码,您将获得输出:

  

答案是:< br>
  &LT峰; br>

class Program
{
    static void Main(string[] args)
    {
        HtmlElement element = new HtmlElement();
        element.InnerHtml = "<br>";

        string val = element.InnerHtml != null ? element.InnerHtml : element.InnerText != null ? element.InnerText : element.TagName;
        Console.WriteLine("The answer is: "+val); // correct
        Console.WriteLine("The answer is: " +element.InnerHtml !=null ? element.InnerHtml : element.InnerText != null ? element.InnerText : element.TagName); // bug?
        Console.ReadLine();

    }
}
public class HtmlElement
{
    public string InnerHtml { get; set; }
    public string InnerText { get; set; }
    public string TagName { get; set; }
}

第二行发生了什么,预计会是:

  

答案是:&lt; br&gt;

只是澄清任何想知道的冲浪者的答案:

Console.WriteLine("The answer is: " +element.InnerHtml !=null ? element.InnerHtml : element.InnerText != null ? element.InnerText : element.TagName); // bug?

正在评估为

Console.WriteLine(("The answer is : " + element.InnerHtml != null) ? element.InnerHtml : element.InnerText != null ? element.InnerText : element.TagName); // bug?

4 个答案:

答案 0 :(得分:18)

您的The answer is: " +element.InnerHtml优先于!= null

重写为:

Console.WriteLine("The answer is: " + (element.InnerHtml !=null ? element.InnerHtml : element.InnerText != null ? element.InnerText : element.TagName)); // bug?

(添加括号)

答案 1 :(得分:15)

这是一个优先问题。你的陈述:

"The answer is: " + element.InnerHtml !=null ? element.InnerHtml : ...

应评估为:

"The answer is: " + (element.InnerHtml !=null ? element.InnerHtml : ...)
                    <------------------- this first ------------------->

但实际上评估为:

("The answer is: " + element.InnerHtml) !=null ? element.InnerHtml : ...
<------------- this first ------------>

最后一个表达式始终为真,因为"string" + anything != null,所以你总是得到element.InnerHtml (<br>)

您在第一次测试中没有遇到问题的原因是您分别评估val,因此手动控制优先级。

顺便说一句,我喜欢人们似乎认为他们在数百万其他人使用的软件中发现了一个错误的方式,而不是考虑他们可能做错了什么的最轻微的可能性: )

虽然说实话,我发现许多人使用的一个产品中存在漏洞(如果我没记错的话,是Microsoft COBOL编译器),但那是由于签名/未签名的问题,我有一台最早的机器512K RAM(检查启动代码以确保您有足够的内存,并将640K视为负数)。

尽管如此,在25年的时间里发现的一个错误相当低,所以你不应该认为软件会立即出现故障。我的第一个想法总是以某种方式填满(而且我通常是对的,非常令我懊恼)。

答案 2 :(得分:1)

两个写作线写入不同结果的原因是你的逻辑中的一个微妙的错误。 (优先规则与您的预期不同,如其他地方所述)

行:

string val = element.InnerHtml != null ? element.InnerHtml : element.InnerText != null ? element.InnerText : element.TagName;

判断element.InnerHtml是否与null不同,其中line:

Console.WriteLine("The answer is: " +element.InnerHtml !=null ? element.InnerHtml : element.InnerText != null ? element.InnerText : element.TagName); // bug?

评估“答案是否:”+ element.InnerHtml与null不同,它永远不会是,所以结果将始终是element.InnerHtml(文本'答案是'被认为是布尔表达式,因此不会打印)

答案 3 :(得分:1)

因为还没有人回答??

Console.WriteLine("The answer is: " + ( element.InnerHtml ?? 
     element.InnerText ?? element.TagName ) );

需要与()方法相同的一对额外?: