Główne zamieszanie polega na tym, że zakładasz, że wszystkie biblioteki .NET (w tym przypadku Biblioteka Rozszerzonych Numerów, która jest nie część BCL) są napisane w standardowym C#. Nie zawsze tak jest, a różne języki mają różne reguły.
W standardowym C# fragment kodu, który widzisz, spowodowałby przepełnienie stosu, ze względu na sposób działania przeciążenia operatora. Jednak kod nie jest faktycznie w standardowym C# - w zasadzie wykorzystuje nieudokumentowane funkcje kompilatora C#. Zamiast wywoływać operatora, emituje ten kod:
ldarg.0
ldarg.1
ceq
ret
to jest to :) Nie ma 100% równoważny kod C# - to po prostu nie jest możliwe w C# z własnego typu.
Nawet wtedy rzeczywisty operator nie jest używany podczas kompilowania kodu C# - kompilator wykonuje kilka optymalizacji, jak w tym przypadku, gdzie zastępuje wywołanie op_Equality
za pomocą prostego . Ponownie, nie można replikować tego w swojej własnej strukturze DoubleEx
- jest to magia kompilatora.
To na pewno nie jest wyjątkowa sytuacja w .NET - jest mnóstwo kodu, który nie jest prawidłowy, standardowy C#. Powodem są zazwyczaj (a) hacki kompilatora i (b) inny język, z nieparzystymi (c) plikami uruchomieniowymi (patrzę na ciebie, Nullable
!).
Od # kompilator Roslyn C jest oepn źródło, mogę rzeczywiście wskazać w miejscu, gdzie rozdzielczość przeciążenie decyduje:
The place where all binary operators are resolved
The "shortcuts" for intrinsic operators
Kiedy patrzysz na skróty, ty” Zobaczysz, że równość między podwójnym i podwójnym wynikiem w wewnętrznym podwójnym operatorze, nigdy nie jest w rzeczywistym operatora ==
zdefiniowanym na typie. System typu .NET musi udawać, że Double
jest typem jak każdy inny, ale C# nie - double
jest prymitywem w języku C#.
Spodziewałbym się niekończącej się rekurencji. – HimBromBeere
Czy mam rację, to przesłoni porównanie z == tylko dla dwóch podwójnych wartości? Tak więc w powrocie można dodać specyfikację anotową –
Jestem prawie pewien, że nie jest używany do porównywania w dowolnym miejscu z podwójnym, zamiast tego "ceq" jest wydawane w IL. To tylko po to, aby wypełnić jakiś cel dokumentacji, Nie można jednak znaleźć źródła. – Habib