c# – 元组==混乱

假设我定义了两个元组:

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

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

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

我期望两个电话都返回true. ==比较究竟是什么?

对于元组,==是比较对象引用,因为它不会重载==运算符.由于对象是等效的,而是不同的具体实例,Equals()返回true,返回false.

许多类型不会重载==,有些更喜欢保持等价的Equals()和==之间的区别以供参考相等.

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

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

上面的代码将始终检查引用的相等性,因为在编译时将一个非约束的泛型视为一个对象,因此如果该方法不是虚拟的,那么您将获得对象的版本(即使是类型,如string overloads ==).

因此这样使用上面的代码:

var x = "Hello";
var y = "H";

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

是的,字符串是等价的,是T是字符串,但是==被绑定到对象的==,因为通用是不受约束的,因此即使具有显式字符串参数的相同代码将返回true,这将返回false.

http://stackoverflow.com/questions/9826664/tuple-confusion

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:c# – 元组==混乱