为什么即使变量是引用类型,Equals和ReferenceEquals方法的结果也不同?

Jen*_*iya 6 c# reference equals object

根据这个 msdn文档

如果当前实例是引用类型,则Equals(Object)方法测试引用相等性,并且对Equals(Object)方法的调用等效于对ReferenceEquals方法的调用.

那么为什么跟随代码导致两个不同的方法调用结果Equals返回True并且ReferenceEquals方法返回false,即使obj并且obj1引用类型为IsClass属性返回true.

using System;

public class Program
{
    public static void Main()
    {
        var obj = new { a = 1, b = 1 };
        var obj1 = new { a = 1, b = 1 };

        Console.WriteLine("obj.IsClass: " + obj.GetType().IsClass);

        Console.WriteLine("object.ReferenceEquals(obj, obj1): " + object.ReferenceEquals(obj, obj1));

        Console.WriteLine("obj.Equals(obj1): " + obj.Equals(obj1));
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

obj.IsClass:是的

object.ReferenceEquals(obj,obj1):False

obj.Equals(obj1):是的

Den*_*s_E 6

objobj1引用2个不同的对象,因此object.ReferenceEquals()将返回false.

Equals()返回true,因为编译器实现Equals()了匿名类型.如果两个对象的所有属性具有相同的值,它将返回true.