11.3.6 같음 연산자와 같지 않음 연산자(C# 7.3)
11.4.5절에서 살펴보겠지만, CLR 수준에서 보면 값 타입 튜플은 처음부터 Equals 메서드를 이용하여 동일성 여부를 비교할 수 있었다. 다만 =과 != 연산자를 오버로드하지 않았다. C# 7.3부터는 두 개의 튜플 사이에 ID 변환이 가능한 경우 두 튜플을 비교할 수 있는 ==과 != 연산자를 컴파일러 차원에서 지원한다(ID 변환이 가능하다는 것은 튜플 요소의 이름은 중요하지 않다는 의미이기도 하다).
컴파일러는 튜플 간의 == 연산자를 튜플의 요소 각각에 대한 == 연산으로 확장한다. 마찬가지로 != 연산자에 대해서도 튜플 요소 각각에 대한 != 연산으로 확장한다. 다음의 예를 살펴보는 것이 가장 이해하기 쉬울 것 같다.
예제 11-8 같음 연산자와 같지 않음 연산자 ▶ EqualityOperators.cs
var t1 = (x: "x", y: "y", z: 1);
var t2 = ("x", "y", 1);
Console.WriteLine(t1 == t2); ----- 같음 연산자
➊
Console.WriteLine(t1.Item1 == t2.Item1 &&
t1.Item2 == t2.Item2 &&
t1.Item3 == t2.Item3);
Console.WriteLine(t1 != t2); ----- 같지 않음 연산자
➋
Console.WriteLine(t1.Item1 != t2.Item1 &&
t1.Item2 != t2.Item2 &&
t1.Item3 != t2.Item3);
➊ 컴파일러가 생성한 코드
➋ 컴파일러가 생성한 코드