Object ==等式失败,但.Equals成功.这有意义吗?

sgt*_*gtz 13 .net c#

可能重复:
C#中==运算符和Equals()方法之间的差异?

两种形式的平等,第一种失败,第二次失败.

(object)"abc" == (object)"abc"
false

((object)"abc").Equals((object)"abc")
true
Run Code Online (Sandbox Code Playgroud)

在下面的参考文献中,我们看到"C#中的等式运算符不是多态的"

ref:字符串等式运算符==在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; }
    }
Run Code Online (Sandbox Code Playgroud)

顺便说一句:我不同意这个问题的完全重复规则,但是嘿.

答案说明:

... String类包含静态bool Equals(字符串a,字符串b)方法和静态bool Equals(对象a,对象b)方法.不同之处在于前者是在String类本身中定义的,而后者是从Object类继承的(它是String的基类)

在语义上这是有道理的,但它在OO和C#语言的更广泛的上下文中是否有意义?

为什么我要烦恼这个问题?好吧,刚刚发现了一个错误,我想在我的大脑中以韵律或理由而不是在"只记得这个"的情况下将其归档,它会在类别之前咬你.

更新:

目前正在考虑使用原语(从功能角度来看)Vs多态性.因为我一直在做越来越多的功能性的东西,这可能是为什么母语让我感到困惑.我还没有想到这一点(不,我不是务实.我被语言设计所吸引).感谢您的回复!

riz*_*lp1 3

(object)"abc" 
Run Code Online (Sandbox Code Playgroud)

将从字符串对象创建一个对象引用。这样做

(object)"abc" == (object)"abc"
Run Code Online (Sandbox Code Playgroud)

将创建两个不相等的对象引用。

但是,使用 equals 方法将检查存储的字符串值是否相等。同样,这不是所有对象的默认实现,而是 String 对象的默认实现。对于任何自定义对象,您应该定义自己的 equals 方法的自定义实现来实现此行为。

  • 您并不是_创建_两个对象引用,您只是告诉编译器您想要比较这两个值,就好像它们都是“object”类型一样,默认情况下,比较引用。 (2认同)
  • 您根本没有创建两个对象 - 字符串文字被保留,因此您正在比较两个相等的引用。由于对“object”的强制转换,仅使用引用比较,但由于它们是对同一对象的两个引用,因此比较将返回 true。 (2认同)