4

ここにこのコードがあります。これは、あらゆるタイプの引数を許可することを目的としています。

public static void AreEqual(object expectedValue, object actualValue) {
    if (expectedValue == actualValue) {
        HttpContext.Current.Response.Write("Equal");
    } else {
        HttpContext.Current.Response.Write("Not Equal");
    }
}

いくつかの int を使用して呼び出すと、うまく動作しません。

AreEqual(3, 3)   // prints Not Equal
4

5 に答える 5

16

最も単純なレベル:

public static void AreEqual(object expectedValue, object actualValue) {
    if (object.Equals(expectedValue,actualValue)) {
            HttpContext.Current.Response.Write("Equal");
    } else {
            HttpContext.Current.Response.Write("Not Equal");
    }
}

またはジェネリックスを使用する ( をサポートIEquatable<T>):

public static void AreEqual<T>(T expectedValue, T actualValue) {
    if (EqualityComparer<T>.Default.Equals(expectedValue,actualValue)) {
            HttpContext.Current.Response.Write("Equal");
    } else {
            HttpContext.Current.Response.Write("Not Equal");
    }
}
于 2009-05-06T09:58:33.750 に答える
4

「奇妙な」動作の理由を強調するために、int をオブジェクトボクシングにキャストすると発生するためです。2 つの 3 がオブジェクトに変換されると、数値を比較するのではなく、参照を比較することになりますが、これは同じではありません。

于 2009-05-06T10:03:43.333 に答える
3

2 つのオブジェクトの値が等しいかどうかを確認するには、次を使用します。

if (Object.Equals(expectedValue, actualValue)) {

通常の == 演算子は anobjectが参照型であると想定しているため (値型もオブジェクトから派生しているという事実にもかかわらず)。

于 2009-05-06T09:59:36.337 に答える
2

試す:

if (expectedValue.Equals(actualValue))

もちろん、を処理する必要があるnullため、これを試してください:

Boolean eq = false;
if (expectedValue == null || actualValue == null)
    eq = (expectedValue == actualValue);
else
    eq = expectedValue.Equals(actualValue);

if (eq) {
    HttpContext.Current.Response.Write("Equal");
} else {
    HttpContext.Current.Response.Write("Not Equal");
}

これはもちろん@mike nelsonの答えと同じです:

if (Object.Equals(expectedValue, actualValue))

彼の答えに賛成票を投じてください。

于 2009-05-06T09:59:14.217 に答える
-3
if (expectedValue != null)
{
    if (expectedValue.Equals(actualValue))
    {
        // enter code here
    }
}
于 2009-05-06T09:59:18.087 に答える