3

DataRowループ内の2 つの s を比較しようとしています。ただし、次のifステートメントは を返しませんtrue

if (dt1.Rows[0]["Name"] == dt2.Rows[b]["Name"]) {
    // This never executes
}

ただし、.ToString()各の最後に追加するとDataRowifステートメントは次を返しますtrue

if (dt1.Rows[0]["Name"].ToString() == dt2.Rows[b]["Name"].ToString()) {
    // This now executes
}

列「名前」は同じテーブル/列からのものです。質問は非常に簡単です...私は何を間違っていますか?

ありがとう
スティーブン

4

3 に答える 3

9

これらのセルはオブジェクトを保持しているため、オブジェクト比較を行っています。これは参照比較を行うだけであり、値比較とは異なります。「これらの 2 つのオブジェクトは本当に同じオブジェクトですか?」という質問をします。基本的に、これらは同じオブジェクトを参照しているため、「参照比較」です。ToString() 呼び出しを行うと、文字列比較が行われます。それが機能する理由です。

Operator== と比較に関する MS の議論へのリンクを次に示します。

于 2009-03-05T13:21:26.170 に答える
7

itsmatt が言ったように、最初のスニペットは参照比較を行っています。呼び出しに代わる方法は、次ToStringを使用することObject.Equalsです。

if (Object.Equals(dt1.Rows[0]["Name"], dt2.Rows[b]["Name"])) {
    // stuff
}

インスタンス メソッドの代わりに静的メソッドを使用する理由は、null 参照の問題を回避するためです。

于 2009-03-05T13:24:22.183 に答える
4

オーバーロードされていない場合、この==演算子は次と同じです。つまり、指定された 2 つの s が同じインスタンスであるReferenceEquals()かどうかを判断します。object

への呼び出しは、文字列比較を行うオーバーロードされた演算子を持つクラスToString()のオブジェクトを返します。string==

于 2009-03-05T13:23:08.973 に答える