代码之家  ›  专栏  ›  技术社区  ›  Chris S

console.writeline语句中的错误在哪里?

  •  0
  • Chris S  · 技术社区  · 15 年前

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

    答案是:<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 回复  |  直到 15 年前
        1
  •  18
  •   CMerat    15 年前

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

    改写为:

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

    (添加括号)

        2
  •  15
  •   paxdiablo    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视为负数)。

    不过,在四分之一个世纪里发现的一个bug非常低,所以你不应该认为软件马上就出了故障。我的第一个想法总是不知何故地被塞住(我通常是对的,这让我很懊恼)。

        3
  •  1
  •   Henk Holterman    15 年前

    因为没人回答 ?? 然而:

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

    需要一对额外的 () 作为 ?: 接近。

        4
  •  1
  •   Rune FS    15 年前

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

    线:

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

    计算element.innerhtml是否与空值不同,其中作为行:

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

    评估“answer is:”+element.innerhtml是否不同于空值(它永远不会是空值),因此结果始终为element.innerhtml(并且文本“answer is”被视为布尔表达式的一部分,因此不会打印出来)。

    推荐文章