元组==混乱

假设我定义了两个元组:

Tuple tuple1 = new Tuple(1.0f, 2.0f, 3.0f, 4.0f); Tuple tuple2 = new Tuple(1.0f, 2.0f, 3.0f, 4.0f); 

如果我尝试比较元组,我会得到不同的结果

 bool result1 = (tuple1 == tuple2); // FALSE bool result2 = tuple1.Equals(tuple2); // TRUE 

我希望两个调用都能返回true。 究竟是什么==比较?

对于Tuple,==正在比较对象引用,因为它不会使==运算符重载 。 由于对象是等效的,但不是相同的特定实例, Equals()返回true==返回false

许多类型不会重载== ,有些人更喜欢区分等价的Equals()和参考相等的==

另外,依赖于==等价可能会导致一些奇怪:

 public bool AreSame(T first, T second) where T : class { return first == second; } 

上面的代码将始终检查引用相等性,因为无约束generics在编译时被视为object ,因此如果该方法不是虚拟的,您将获得对象的版本(即使类型,例如string重载== )。

这样使用上面的代码:

 var x = "Hello"; var y = "H"; // doing concat to avoid string interring AreSame(x, y+"ello"); 

是的,字符串是等价的,是Tstring ,但是==绑定到对象的==因为generics是不受约束的,因此即使具有显式string参数的相同代码返回false ,这也将返回false

==正在比较对象引用。 Tuple类不会重载==运算符,因此您需要使用.Equals

== for Tuple只能看到引用,因此你会看到它是假的。

PS:推荐的方法是做类似的事情:

 var tuple1 = Tuple.Create(1.0f, 2.0f, 3.0f, 4.0f)