【发布时间】:2009-08-21 14:05:50
【问题描述】:
如果你运行下面的代码,你会得到输出:
答案是:
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; }
}
第二行发生了什么,预计是:
答案是:
只是为了澄清任何好奇的冲浪者的答案:
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?
【问题讨论】:
-
为了便于阅读,我会重写那些嵌套的 ?: 操作,或者至少将它们分成单独的行。
-
@Jason: 重写为 element.InnerHtml ??元素.InnerText ?? element.TagName 会很好
-
Console.WriteLine("答案是:{0}", element.InnerHtml !=null ? element.InnerHtml : element.InnerText != null ? element.InnerText : element.TagName);
-
@Jason 我已经论证了这一点,但正如我在下面所说的那样,这是别人的代码,这是他的偏好
-
@Hans,Console.WriteLine 使用 string.format 和 IFormattable
标签: c# .net operator-precedence