在 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
给定两个 (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