我有一个问题为什么它会这样工作
var a = new Tuple<object, object, object>(1, 1, 1);
var b = new Tuple<object, object, object>(1, 1, 1);
Console.WriteLine(a.Item1==b.Item1);//Output- False
Console.WriteLine(a.Equals(b));//Output- True
Console.WriteLine(a==b);//Output- False
为什么会这样?
我尝试找到一些有关其工作原理的信息,据我所知,这是由于对象类型和值类型(int)而发生的
这就是 C# 中 value 和 reference 类型之间的区别。
Console.WriteLine(a.Item1==b.Item1);//输出- False
这里您正在比较两个
object
实例。对于任何引用类型,相等运算符(除非在该类型中被重写)进行引用比较。
当您将任何值类型(例如,在您的情况下为
int
)存储在引用类型的变量(在您的情况下为 object
)时,您正在执行名为 boxing 的操作。
Console.WriteLine(a.Equals(b));
这是因为
Equals
方法在 int
类型中被重写。
Console.WriteLine(a==b);
同样,您有
Tuple
类的两个实例(任何类都是引用类型),并且该 Tuple
类没有 ==
运算符的覆盖。因此,您只需检查这两个变量是否包含相同的实例。您仍然可以使用 a.Equals(b)
来检查这两个元组的 contents 是否相同,它会为每个元组调用 Equals
并在您的情况下返回 true
。