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; }
}

2 行目に何が起こったのか、次のようになると予想されます。

答えは次のとおりです。 <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 ------------>

その最後の式は常に true であるため"string" + anything != null、常に . だけが得られますelement.InnerHtml (<br>)

最初のテストで問題が発生しない理由は、val個別に評価しているため、優先順位を手動で制御しているためです。

余談ですが、何百万という無数の人々が使用しているソフトウェアのバグを発見したと人々が思い込んでいるようなやり方が好きです。

正直なところ、多くの人が使用している 1 つの製品 (私の記憶が正しければ Microsoft COBOL コンパイラー) でバグを見つけましたが、それは署名付き/未署名の問題によるもので、512K 以上の RAM (ここで、起動コードは十分なメモリがあることを確認し、640K を負の量として処理しました)。

それでも、四半世紀に発見された 1 つのバグはかなり少ないので、ソフトウェアに問題があるとすぐに想定すべきではありません。私が最初に考えるのは、いつも何かを詰め込んでしまったということです (そして、たいていは正しいのですが、悔しい思いをしています)。

于 2009-08-21T14:10:40.487 に答える
1

2 つの書き込み行が異なる結果を書き込む理由は、ロジックの微妙なバグです。(他の場所で説明されているように、優先順位のルールは予想とは異なります)

この線:

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?

"The answer is: " +element.InnerHtml が null と異なるかどうかを評価します。null になることはありません。そのため、結果は常に element.InnerHtml になります (そして、テキスト 'The answer is' はブール式の一部と見なされ、したがって、印刷されません)

于 2009-08-21T14:37:24.020 に答える
1

誰も??まだ答えていないので:

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

アプローチと同じ追加()のペアが必要です。?:

于 2009-08-21T15:08:13.983 に答える