Penso che questo sia un bug nel compilatore C#.Perché il compilatore valuta il resto MinValue% -1 diverso dal runtime?
Considerate questo codice (all'interno di un metodo):
const long dividend = long.MinValue;
const long divisor = -1L;
Console.WriteLine(dividend % divisor);
Compila senza errori (o avvisi). Sembra un insetto. Durante l'esecuzione, stampa 0
sulla console.
Poi, senza l'const
, il codice:
long dividend = long.MinValue;
long divisor = -1L;
Console.WriteLine(dividend % divisor);
Quando questo viene eseguito, si traduce correttamente in un OverflowException
essere gettato.
La specifica del linguaggio C# menziona specificamente questo caso e dice che viene emesso un System.OverflowException
. Non dipende dal contesto checked
o unchecked
sembra (anche il bug con gli operandi costanti in fase di compilazione per l'operatore restante è lo stesso con checked
e unchecked
).
Lo stesso errore si verifica con int
(System.Int32
), non solo long
(System.Int64
).
Per il confronto, il compilatore gestisce dividend/divisor
con gli operandi const
molto meglio di dividend % divisor
.
Le mie domande:
ho ragione questo è un bug? Se sì, è un bug noto che non desiderano correggere (a causa della retrocompatibilità, anche se è piuttosto sciocco usare % -1
con una costante in fase di compilazione -1
)? O dovremmo segnalarlo in modo che possano risolverlo nelle prossime versioni del compilatore C#?
Menzionare @EricLippert potrebbe attirare la folla giusta per questa domanda :) –
@Morten, a questo punto, potrebbe semplicemente guardare stupefatto dal suo posatoio a Coverity. ;) –
Penso che dovresti mettere una taglia su questo perché mi irrita perché questo sta accadendo. Le specifiche dicono che qualsiasi espressione costante che può generare un'eccezione run-time dovrebbe causare un errore in fase di compilazione durante la compilazione !! –