0

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

答案是:<br>
<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; }
}

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

答案是:<br>

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

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

4 回答 4

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?

(加括号)

于 2009-08-21T14:08:19.007 回答
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(启动代码检查以确保您有足够的内存并将 640K 视为负数)。

尽管如此,在 25 年中发现的一个错误非常低,因此您不应该立即认为该软件有问题。我的第一个想法总是不知何故我已经塞满了(我通常是对的,这让我很懊恼)。

于 2009-08-21T14:10:40.487 回答
1

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

该行:

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

评估 element.InnerHtml 是否与 null 不同,其中行:

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

评估“答案是:” +element.InnerHtml 是否不同于 null,它永远不会,因此结果将始终是 element.InnerHtml(并且文本“答案是”被认为是布尔表达式的一部分,并且因此不会打印)

于 2009-08-21T14:37:24.020 回答
1

因为还没有人回答??

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

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

于 2009-08-21T15:08:13.983 回答