1

我有代码,我将字符串作为输入,并将其与整数进行比较。

我看到整数变量也有一个Equals接受字符串参数的函数。

我直接使用它认为它会进行类型转换。

它没有给出任何编译时间或运行时错误,但它总是给出错误的结果。

例如,

int sessionId = 1;

string requestId="1"

return sessionId.Equals(requestId);

sessionId.Equals(requestId)总是给出错误的。

为什么会出现这种行为?如果有原因,他们为什么允许它无错误地运行?

4

5 回答 5

5

Integers and strings are always different, and thus "1".Equals(1) returns false.

It compiles because object.Equals(object other) takes an object as the right side, and thus accepts any type.

于 2012-11-21T12:20:20.413 回答
3

发生这种情况的原因是字符串“0”与0不同,所以它返回false。为什么支持这种行为?因为 Equals 方法允许您将对象作为参数传递,而字符串在对象中,所以“允许”您这样做。正如您所发现的,在这种情况下它不是很有用。

要解决您的问题,要么获取整数的字符串表示形式,要么将字符串解析为整数,然后进行比较。

例如尝试

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

或者

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

如果您选择后者,您可能需要考虑 Parse 是否会失败以及如何处理。

于 2012-11-21T12:22:37.003 回答
1

是的,Equals 采用右侧的任何类型,因为它需要一个对象。但在函数内部,它需要与左侧相同的类型。恕我直言,没有必要为类型不匹配抛出异常,因为人们只想知道两种类型的相等性。

反编译的 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其传递Int32Equals. 由于该覆盖可以接受对任何类型的堆对象的引用,因此传递字符串“1”没有问题。反过来,该方法知道它被赋予了Int32与值为 1 的 an 不同的东西。它不知道调用代码不可能提供任何与 an 匹配的东西Int32; 它所知道的只是特定的值不一样,并且由于值不一样,它完全愉快地返回false

于 2012-11-27T18:37:42.890 回答
1

我们不应该使用 String.Compare 进行字符串比较而忘记 Equals 吗?

我确实有同样的问题,我相信函数 Equals 应该抛出异常。就我而言,我一直在将字符串与布尔值进行比较。

现在的讨论走错路了。这是我的观点:如果属于两个不同类的对象之间的比较总是返回 false,那么它们首先不需要进行比较。

如果需要有一个绕过类型检查的函数,那么应该有一个。但是,将函数 Equals 定位为字符串比较的推荐方法,同时引入不必要的错误(可能永远存在于您的程序中)的可能性是一种不负责任的做法。此外,函数调用 String.Equals(string1, string2, StringComparison. xxx) 也接受非字符串参数是非常具有误导性的。因此不仅是 string1.Equals(string2)。

如果这是设计使然,那么这是一个糟糕的设计。

于 2016-02-17T10:33:48.333 回答