在 C# 中检查值元组是否相等的正确方法?

Correct way to check value tuples for equality in C#?

给定两个 (int, int) 类型的变量,我如何检查它们是否表示相等的值?

例如:

var a = (1, 2);
var b = (1, 2);

var c = a == b; // Error CS0019 Operator '==' cannot be applied to operands
                // of type '(int, int)' and '(int, int)'

如何在 C# 7 中完成这种比较?我应该使用 .Equals 还是其他方式?

在 C# 7.3 之前,您有两个选择:使用 .Equals,或者您可以为本身支持 == 的元素手写 == 比较:

(a, b).Equals((c, d)) // true if a.Equals(c) && b.Equals(d)

a == c && b == d // works if the types support ==

(For details of how Equals() works, check out the source.)

从 C# 7.3 开始,对 == 的直接支持已添加到值元组中:

(a, b) == (c, d) // compiler converts to a == c && b == d

注意这里的==不是元组类型定义的运算符。它是一个 "compiler trick" 递归地(对于嵌套元组)对每个元素执行 ==。因此,只有元素本身支持 == 时才能使用此技术。因此,这种方法不适用于泛型,除非受限于支持 == 的类型。所以下面的代码不会编译:

public bool Compare<T1, T2>((T1 a, T2 b) x, (T1 a, T2 b) y) => x == y