La confusione principale qui è che si presume che tutte le librerie .NET (in questo caso, la libreria di numeri estesi, che è non una parte del BCL) siano scritte in C# standard. Questo non è sempre il caso, e lingue diverse hanno regole diverse.
In C# standard, la parte di codice che si sta visualizzando comporterebbe un sovraccarico dello stack, a causa del modo in cui la risoluzione di sovraccarico dell'operatore funziona. Tuttavia, il codice non è in realtà in C# standard - fondamentalmente utilizza funzionalità non documentate del compilatore C#. Invece di chiamare l'operatore, emette questo codice:
ldarg.0
ldarg.1
ceq
ret
Questo è tutto :) Non esiste un equivalente codice C# 100% - questo semplicemente non è possibile in C# con il proprio tipo.
Anche in questo caso, l'operatore effettivo non viene utilizzato durante la compilazione del codice C# - il compilatore esegue una serie di ottimizzazioni, come in questo caso, in cui sostituisce la chiamata op_Equality
con il semplice ceq
. Ancora una volta, non è possibile replicare questo nella propria struttura DoubleEx
- è magia del compilatore.
Questo certamente non è una situazione unica in .NET - c'è un sacco di codice che non è valido, C# standard. Le ragioni sono solitamente (a) hack del compilatore e (b) una lingua diversa, con gli hack runtime (c) dispari (ti sto guardando, Nullable
!).
Dal momento che l'Roslyn compilatore C# è fonte oepn, posso effettivamente puntare nel luogo in cui la risoluzione di sovraccarico è deciso:
The place where all binary operators are resolved
The "shortcuts" for intrinsic operators
Quando si guardano le scorciatoie, si' Vedremo che l'uguaglianza tra doppio e doppio risulta nell'operatore intrinseco doppio, mai nell'effettivo ==
definito dal tipo. Il sistema di tipo .NET deve fingere che Double
sia un tipo come un altro, ma C# no - double
è una primitiva in C#.
Mi aspetterei una ricorsione senza fine. – HimBromBeere
ho ragione, questo prevale sul confronto con == solo per due valori doppi? Quindi nel ritorno è possibile aggiungere le specifiche anoter –
Sono abbastanza sicuro che non è usato per il confronto ovunque con il doppio, invece 'ceq' è emesso in IL. Questo è solo lì per riempire alcuni scopi di documentazione, non è possibile trovare la fonte però. – Habib