4

我在这里有这段代码,旨在允许任何类型的参数:

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

如果我使用几个整数来调用它,它的行为就不会很好。

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 转换为对象时会发生装箱。这两个 3 被转换为对象,然后您不再比较数字,而是在比较引用,这将是不一样的。

于 2009-05-06T10:03:43.333 回答
3

要检查两个对象值是否相等,请使用以下命令:

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 回答