Вопрос

Если вы запустите следующий код, вы получите результат:

Ответ таков:<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 (а текст "Ответ есть" считается частью логического выражения и поэтому не будет напечатан)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top