Где ошибка в этой консоли.Инструкция WriteLine?
-
19-09-2019 - |
Вопрос
Если вы запустите следующий код, вы получите результат:
Ответ таков:<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?
Решение
Ваш The answer is: " +element.InnerHtml
имеет приоритет над != null
.
Переписать как:
Console.WriteLine("The answer is: " + (element.InnerHtml !=null ? element.InnerHtml : element.InnerText != null ? element.InnerText : element.TagName)); // bug?
(добавить скобки)
Другие советы
Это проблема приоритета.Ваше заявление:
"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, если я правильно помню), но это было связано с проблемами со знаком / без знака, и у меня была одна из самых ранних машин с более чем 512 КБ оперативной памяти (где код запуска проверял, достаточно ли у вас памяти, и он обрабатывал 640 КБ как некоторое отрицательное значение).
Тем не менее, одна ошибка, обнаруженная за четверть века, - это довольно мало, так что не стоит сразу предполагать, что виновато программное обеспечение.Моя первая мысль всегда заключается в том, что я как-то наелся (и обычно я прав, к большому моему огорчению).
Потому что никто не ответил с ??
пока:
Console.WriteLine("The answer is: " + ( element.InnerHtml ??
element.InnerText ?? element.TagName ) );
Который нуждается в такой же паре дополнительных ()
в качестве ?:
подходите.
Причина, по которой две линии записи записывают разные результаты, заключается в незначительной ошибке в вашей логике.(правила приоритета отличаются от того, что вы ожидаете, как указано в другом месте)
линия:
string val = element.InnerHtml != null ? element.InnerHtml : element.InnerText != null ? element.InnerText : element.TagName;
вычисляет элемент if.innerHTML отличается от null where в качестве строки:
Console.WriteLine("The answer is: " +element.InnerHtml !=null ? element.InnerHtml : element.InnerText != null ? element.InnerText : element.TagName); // bug?
оценивает, является ли "Ответ:" +элемент.innerHTML отличается от null, которым он никогда не будет, поэтому результатом всегда будет element .innerHTML (а текст "Ответ есть" считается частью логического выражения и поэтому не будет напечатан)