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

时间:2017-05-26 04:41:04

标签: c# tuples comparison equality c#-7.0

给定两个(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代替还是以其他方式使用它?

1 个答案:

答案 0 :(得分:11)

在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

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

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