【发布时间】:2016-11-15 23:30:26
【问题描述】:
考虑以下代码。
object str = new string(new char[] { 't', 'e', 's', 't' });
object str1 = new string(new char[] { 't', 'e', 's', 't' });
Console.WriteLine(str==str1); // false
Console.WriteLine(str.Equals(str1)); // true
我理解相等运算符在这里工作,因为我们已隐式转换为对象,相等运算符正在检查两者的引用是否相等并返回 false。
但我对第二个感到困惑,返回 true 看起来它正在调用 String 类型提供的 Equals 覆盖实现,并且它检查字符串的内容是否相等。
我的问题是为什么它也不检查运算符的内容相等性,它们的实际类型是字符串而不是对象。对吧?
而以下代码为两者都输出 ture:
object str = "test";
object str1 = "test";
Console.WriteLine(str==str1); // true
Console.WriteLine(str.Equals(str1)); // true
【问题讨论】:
-
对函数或变量的调用总是尽可能接近对象的实际类。对
Equals的调用因此调用string.Equals,它被定义为比较字符串的内容,而不是默认的object.Equals。如果您绝对想使用object的Equals,可以使用(str as object)?.Equals(str1 as object)。 -
@khlr 您应该补充说,作为答案,当前存在的问题有点错过了为什么它正在发生
-
但是错了——字符串不是值类型。
-
@khlr
string不是真正的值类型;它是一个不可变的引用类型,它覆盖Equals并具有 C# 预定义的重载operator ==。编辑:马修打败了我。 -
@Jeppe 啊,当然,你是对的!
标签: c# inheritance equals equality