1

文字列を入力として取得するコードがあり、それを整数と比較します。

整数変数にEqualsは、文字列パラメーターを受け入れる関数もあることがわかりました。

型キャストすることを考えて直接使用しました。

コンパイル時や実行時エラーは発生しませんでしたが、常に誤った結果になります。

例えば、

int sessionId = 1;

string requestId="1"

return sessionId.Equals(requestId);

sessionId.Equals(requestId)常にfalseを与えます。

なぜそのような行動の理由ですか?理由がある場合、なぜ彼らはそれをエラーなしで実行することを許可しているのですか?

4

5 に答える 5

5

整数と文字列は常に異なるため、"1".Equals(1)falseを返します。

object.Equals(object other)object右側であるためコンパイルされ、任意のタイプを受け入れます。

于 2012-11-21T12:20:20.413 に答える
3

これが発生する理由は、文字列「0」が0と同じではないため、falseを返すためです。なぜそのような振る舞いがサポートされているのですか?Equalsメソッドを使用すると、オブジェクトをパラメーターとして渡すことができ、文字列がオブジェクト内にあるため、これを行うことが「許可」されます。お気づきのように、この場合はあまり役に立ちません。

問題を解決するには、整数の文字列表現を取得するか、文字列を整数に解析してから比較します。

例:試してみてください

    return (sessionId.ToString() == requestId);

また

    return (sessionId == int.Parse(requestId));

後で選択する場合は、解析が失敗する可能性があるかどうか、およびそれをどのように処理するかを検討する必要があります。

于 2012-11-21T12:22:37.003 に答える
1

はい、Equalsはオブジェクトを必要とするため、右側で任意のタイプを取ります。ただし、関数内では左側と同じタイプが必要です。私見では、2つの型の同等性について知りたいだけなので、型の不一致に対して例外をスローする必要はありません。

逆コンパイルされたintの等しい:

public override bool Equals(object obj)
{
    return obj is int && this == (int)obj;
}
于 2012-11-21T12:29:27.273 に答える
1

誰かがあなたに車とバナナを見せて、それらが同じものであるかどうか尋ねた場合、あなたは車が車でバナナが果物であるために気性のタントラムを投げますか、それとも単に「いいえ、彼らは同じこと"?

多くの言語では、整数と文字列を比較しようとするとコンパイラエラーが発生します。これは、整数と文字列が同じものになる可能性がないことをコンパイラが認識しているため、それらを比較しようとしたコードはほぼ間違いなくエラーになるためです。一方、と言うsessionId.Equals(requestId)と、コンパイラは、のオーバーライドにrequestId渡されるように要求していることを認識します。このオーバーライドは任意の種類のヒープオブジェクトへの参照を受け入れることができるため、文字列「1」を渡すのに問題はありません。そのメソッドは、値が1のと同じではないものが与えられたことを認識します。呼び出し元のコードが、Int32EqualsInt32Int32; それが知っているのは、特定の値が同じではないということだけです。値が同じではないため、完全に幸せに戻りますfalse

于 2012-11-27T18:37:42.890 に答える
1

文字列の比較にString.Compareを使用して、Equalsを忘れてはいけませんか?

私も同じ問題を抱えていました。関数Equalsは例外をスローするはずだと思います。私の場合、文字列をブール値と比較しています。

今までの議論は間違った方向に進んだ。これが私の見解です。2つの異なるクラスに属するオブジェクト間の比較が常にfalseを返す場合、そもそもそれらを比較する必要はありません。

型チェックをバイパスする機能が必要な場合は、それが必要です。ただし、関数Equalsを文字列比較の推奨方法として位置付けると同時に、不要なバグ(プログラムに永遠に存在する可能性がある)の可能性を導入することは、一種の無責任です。さらに、関数呼び出しString.Equals(string1、string2、StringComparison。xxx)が文字列以外の引数も受け入れることは非常に誤解を招きます。したがって、string1.Equals(string2)だけではありません。

それが設計によるものである場合、それは貧弱な設計です。

于 2016-02-17T10:33:48.333 に答える