You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于Tuple<object>的==运算符与Equals方法行为差异的疑问

C# Tuple比较结果差异解析

先看问题代码:

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

下面逐个拆解三种输出的原因:

1. a.Item1 == b.Item1 → False

把int类型的1传入object类型参数时,值类型会被装箱——也就是创建一个新的object实例来包裹这个int值。每次装箱都会生成独立的对象,所以a.Item1和b.Item1是两个完全不同的引用对象。

对于object这类引用类型,默认的==运算符比较的是对象的内存引用地址,不是包裹的值。因为两个对象地址不同,所以结果为False。

2. a.Equals(b) → True

Tuple<T1,T2,T3>类专门重写了Equals方法,它的逻辑是依次对比元组中每个位置的元素是否相等,而这里的“相等”是调用元素自身的Equals方法来判断。

对于装箱后的int对象,Equals方法会先验证类型一致,再对比底层的数值。因为两个元组的所有对应元素值都是1,每个元素的Equals都返回True,所以整个元组的Equals结果为True。

3. a == b → False

Tuple<T1,T2,T3>没有重载==运算符,所以这里使用的是object类的默认==行为——依然是比较引用地址。a和b是两个独立创建的Tuple实例,内存地址不同,因此结果为False。

内容的提问来源于stack exchange,提问作者Кирилл Гелашвили

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 03:52:12