auf dieser interessanten Frage Basierend: Addition of int and uint und um mit konstantem Falten liebäugelt wie in Nicholas Carey'sanswer erwähnt, habe ich auf ein scheinbar inkonsistentes Verhalten des Compilers gestolpert:uint und int und konstantes Falten Subtrahierend
des Betrachten folgende Code-Schnipsel:
int i = 1;
uint j = 2;
var k = i - j;
Hier löst der Compiler korrekt k
-long
. Dieses spezielle Verhalten ist in den Spezifikationen gut definiert, wie in den Antworten auf die zuvor erwähnte Frage erläutert.
Was überraschend für mich war, ist, dass das Verhalten ändert, wenn sie mit wörtlichen Konstanten oder Konstanten im Allgemeinen zu tun. Lesen Nicholas Careys answer erkannte ich, dass das Verhalten unvereinbar sein könnten, so hab ich gecheckt und sicher genug:
const int i = 1;
const uint j = 2;
var k = i - j; //Compile time error: The operation overflows at compile time in checked mode.
k = 1 - 2u; //Compile time error: The operation overflows at compile time in checked mode.
k
in diesem Fall gelöst Uint32
.
Gibt es einen Grund dafür, dass das Verhalten bei Konstanten anders ist oder ist das ein kleiner, aber unglücklicher "Fehler" (Fehlen eines besseren Begriffs) im Compiler?
Bei einer Schätzung führt der Compiler keine impliziten Konvertierungen für Konstanten. – Powerlord
@Powerlord Nun, es muss, schließlich konvertiert es implizit "int" zu "uint". – InBetween
Die Spezifikation berücksichtigt dies jedoch ... §6.1.9 Implizite konstante Ausdrucksumwandlungen: "Ein konstanter Ausdruck (§7.19) vom Typ int kann in den Typ' sbyte', 'byte',' short', 'konvertiert werden ushort', 'uint' oder' ulong', vorausgesetzt, der Wert des Konstantenausdrucks liegt innerhalb des Bereichs des Zieltyps. " Immer noch versuchen zu finden, was es für Literale und/oder konstante Variablen sagt. – Powerlord