MSDN==
운영자 의 문서에 따르면 ,
미리 정의 된 값 형식의 경우 항등 연산자 (==)는 피연산자의 값이 같으면 true를 반환하고 그렇지 않으면 false를 반환합니다. string 이외의 참조 유형의 경우 ==는 두 피연산자가 동일한 객체를 참조하면 true를 반환합니다. 문자열 유형의 경우 ==는 문자열 값을 비교합니다. 사용자 정의 값 유형은 == 연산자를 오버로드 할 수 있습니다 (연산자 참조). 기본적으로 ==는 미리 정의 된 참조 유형과 사용자 정의 참조 유형 모두에 대해 위에서 설명한대로 작동 하지만 사용자 정의 참조 유형도 가능합니다.
그렇다면 왜이 코드 스 니펫이 컴파일에 실패합니까?
bool Compare<T>(T x, T y) { return x == y; }
'T'및 'T'유형의 피연산자에 연산자 '=='를 적용 할 수 없다는 오류가 발생 합니다. ==
연산자가 모든 유형에 대해 사전 정의되어 있다는 것을 이해하는 한 왜 궁금 합니다.
편집 : 감사합니다. 처음에는 그 진술이 참조 유형에 관한 것임을 알지 못했습니다. 나는 또한 그 비트 단위 비교가 지금 알고있는 모든 값 유형, 제공됩니다 생각 하지 올바른.
그러나 참조 유형을 사용하는 경우 ==
연산자가 사전 정의 된 참조 비교를 사용합니까, 또는 유형이 정의 된 경우 오버로드 된 연산자 버전을 사용합니까?
편집 2 : 시행 착오를 통해 ==
연산자가 무제한 제네릭 형식을 사용할 때 사전 정의 된 참조 비교를 사용 한다는 것을 알았습니다 . 실제로 컴파일러는 제한된 유형 인수에 대해 가장 좋은 방법을 사용하지만 더 이상 보지 않습니다. 예를 들어, 아래 코드 는 호출 된 true
경우에도 항상 인쇄 됩니다 Test.test<B>(new B(), new B())
.
class A { public static bool operator==(A x, A y) { return true; } }
class B : A { public static bool operator==(B x, B y) { return false; } }
class Test { void test<T>(T a, T b) where T : A { Console.WriteLine(a == b); } }
==
동일한 유형의 두 피연산자 사이에 허용되지 않는 유형이 있음을 이해하는 것이 유용 할 수 있습니다 . 이는 struct
과부하가 발생하지 않는 유형 ( "사전 정의 된"유형 제외)에 해당 operator ==
됩니다. 간단한 예를 들어,이 시도 :var map = typeof(string).GetInterfaceMap(typeof(ICloneable)); Console.WriteLine(map == map); /* compile-time error */
var kvp1 = new KeyValuePair<int, int>(); var kvp2 = kvp1;
확인할 수 없으며 C # 사전 정의 유형이 아니며을 오버로드하지 않습니다 . 그러나 당신이 할 수없는 예제가 있습니다 (여기서는 오버로드하지 않는 중첩 된 구조체 ( 런타임에 의해 호출 됨 )가 있습니다). kvp1 == kvp2
KeyValuePair<,>
operator ==
var li = new List<int>(); var e1 = li.GetEnumerator(); var e2 = e1;
e1 == e2
List<>.Enumerator
"List`1+Enumerator[T]"
==
bool
A로부터 void
...