Ich denke, das sieht nach einem Fehler im C# -Compiler aus.Warum wertet der Compiler den Rest MinValue% -1 anders als die Laufzeit aus?
Betrachten Sie diesen Code (innerhalb einer Methode):
const long dividend = long.MinValue;
const long divisor = -1L;
Console.WriteLine(dividend % divisor);
Es ohne Fehler kompiliert (oder Warnungen). Scheint wie ein Fehler. Wenn ausgeführt, druckt 0
auf der Konsole.
Dann ohne const
, der Code:
long dividend = long.MinValue;
long divisor = -1L;
Console.WriteLine(dividend % divisor);
Wenn dies ausgeführt wird, es ergibt sich korrekt in einem OverflowException
geworfen.
Die C# -Sprachbeschreibung erwähnt diesen Fall speziell und sagt, dass ein System.OverflowException
geworfen werden soll. Es hängt nicht vom Kontext checked
oder unchecked
es scheint (auch der Fehler mit der Kompilierzeit Konstante Operanden zum Rest-Operator ist der gleiche mit checked
und unchecked
).
Derselbe Fehler passiert mit int
(System.Int32
), nicht nur long
(System.Int64
).
Zum Vergleich behandelt der Compiler dividend/divisor
mit const
Operanden viel besser als dividend % divisor
.
Meine Fragen:
Bin ich dieses Recht ist ein Bug? Wenn ja, ist es ein bekannter Fehler, den sie nicht beheben möchten (wegen der Abwärtskompatibilität, auch wenn es ziemlich albern ist, % -1
mit einer Kompilierzeitkonstante -1
zu verwenden)? Oder sollten wir es melden, damit sie es in zukünftigen Versionen des C# -Compilers beheben können?
Erwähnen @EricLippert könnte die richtige Menge für diese Frage zu ziehen :) –
@Morten, an dieser Stelle könnte er gerade verwirrt von seinem Sitz in Coverity starren. ;) –
Ich denke du solltest ein Kopfgeld darauf legen, da es mich irritiert warum das passiert. Die Spezifikationen sagen, dass jeder konstante Ausdruck, der eine Laufzeitausnahme verursachen könnte, einen Kompilierungsfehler bei der Kompilierung verursachen sollte !! –