【发布时间】:2012-09-28 07:45:51
【问题描述】:
可能重复:
Difference between == operator and Equals() method in C#?
两种形式的相等,第一种失败,第二种成功。
(object)"abc" == (object)"abc"
false
((object)"abc").Equals((object)"abc")
true
在下面的参考资料中,我们看到“C# 中的等式运算符不是多态的”
参考:String Equality operator == in c#
顺便说一句:仍然不确定为什么这是一个问题。我以为可能是这样的,但不是因为这次测试成功了。
static void Main(string[] args) {
var o = new classOfT<string>() { val = "abc" };
Console.WriteLine((object)o.val == "abc");
}
public class classOfT<T> {
public string val { get; set; }
}
顺便说一句:我不同意关于这个问题的完全相同的规则,但是,嘿。
答案是:
... String 类同时包含一个静态 bool Equals(string a, string b) 方法和静态 bool Equals(object a, object b) 方法。 不同的是前者是在 String 类中定义的 本身,而后者继承自 Object 类(即 String 的基类)
这在语义上是有道理的,但在更广泛的 OO 和 C# 语言环境中是否有意义?
我为什么要为这个问题烦恼?好吧,刚刚发现了一个错误,我想在我的脑海中将其归档在押韵或理由下,而不是在“记住这个”下,它在类别之前被咬了。
更新:
目前正在考虑使用原语(从功能角度)与多态性。由于我一直在做越来越多的功能性东西,这可能就是为什么母语让我感到困惑。我还没有考虑完这个(不,我不务实。我被语言设计所吸引)。感谢大家的回复!
【问题讨论】:
-
我不是 C# 大师,但似乎第一行是比较对象,它们在内存中是不同的,这就是它失败的原因 - 第二行是比较实际值 'abc'这是平等的,这就是为什么它是真的。
-
@BurhanKhalid 你是对的。字符串对象的 equals 方法将比较存储在对象内部的字符串值。而两个不同的对象引用永远不会相等。
-
有趣的是,在 LINQPad 中
(object)"abc" == (object)"abc"返回True -
(object)"abc" == (object)"abc"返回true。想一想,你现在的文化是什么? -
@Habib:我会进一步调查。 .net 版本是 4。很高兴(也很困惑)它在其他地方直观地按预期工作。谢谢你告诉我。