c#の2つの値が等しいかどうかを確認するにはどうすればよいですか? (任意のタイプの値を指定)

StackOverflow https://stackoverflow.com/questions/828896

  •  06-07-2019
  •  | 
  •  

質問

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

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

2、3のintを使用して呼び出した場合、あまりうまく動作しません。

AreEqual(3, 3)   // prints Not Equal
役に立ちましたか?

解決

最も簡単なレベル:

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

他のヒント

<!> quot; strange <!> quot;の理由を強調するだけです。動作は、オブジェクトにintをキャストすると、ボクシングが発生するためです。 2つの3はオブジェクトに変換され、その後、数値を比較しなくなり、参照を比較します。これは同じではありません。

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

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

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

試してください:

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))

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

if (expectedValue != null)
{
    if (expectedValue.Equals(actualValue))
    {
        // enter code here
    }
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top