실제로 컴파일러는 ==
연산자를 ceq
IL 코드로 바꾸며 언급 한 연산자는 호출되지 않습니다.
소스 코드에서 연산자의 이유는 C # 이외의 언어에서 CEQ
직접 호출로 (또는 리플렉션을 통해) 호출 하지 않는 언어에서 호출 할 수 있습니다 . 연산자 내의 코드 는 로 컴파일 CEQ
되므로 무한 재귀는 없습니다.
실제로 리플렉션을 통해 연산자를 호출하면 연산자가 CEQ
명령이 아닌 호출 되고 프로그램이 예상대로 종료되므로 무한히 재귀하지 않는 것을 알 수 있습니다 .
double d1 = 1.1;
double d2 = 2.2;
MethodInfo mi = typeof(Double).GetMethod("op_Equality", BindingFlags.Static | BindingFlags.Public );
bool b = (bool)(mi.Invoke(null, new object[] {d1,d2}));
결과 IL (LinqPad 4에 의해 컴파일 됨) :
IL_0000: nop
IL_0001: ldc.r8 9A 99 99 99 99 99 F1 3F
IL_000A: stloc.0 // d1
IL_000B: ldc.r8 9A 99 99 99 99 99 01 40
IL_0014: stloc.1 // d2
IL_0015: ldtoken System.Double
IL_001A: call System.Type.GetTypeFromHandle
IL_001F: ldstr "op_Equality"
IL_0024: ldc.i4.s 18
IL_0026: call System.Type.GetMethod
IL_002B: stloc.2 // mi
IL_002C: ldloc.2 // mi
IL_002D: ldnull
IL_002E: ldc.i4.2
IL_002F: newarr System.Object
IL_0034: stloc.s 04 // CS$0$0000
IL_0036: ldloc.s 04 // CS$0$0000
IL_0038: ldc.i4.0
IL_0039: ldloc.0 // d1
IL_003A: box System.Double
IL_003F: stelem.ref
IL_0040: ldloc.s 04 // CS$0$0000
IL_0042: ldc.i4.1
IL_0043: ldloc.1 // d2
IL_0044: box System.Double
IL_0049: stelem.ref
IL_004A: ldloc.s 04 // CS$0$0000
IL_004C: callvirt System.Reflection.MethodBase.Invoke
IL_0051: unbox.any System.Boolean
IL_0056: stloc.3 // b
IL_0057: ret
흥미롭게도 - 동일 사업자가 통합 유형 (중 반사 참조 소스 또는 통해) 존재하지 않습니다 만 Single
, Double
, Decimal
, String
, 그리고 DateTime
, 그들은 다른 언어에서 호출 할 존재 내 이론을 반증한다. 분명히이 연산자없이 다른 언어에서 두 정수를 동일하게 사용할 수 있으므로 "왜 그것들이 존재 double
합니까? "라는 질문으로 되돌아갑니다 .