Hier gibt es zwei Fragen, und es ist wichtig zu beachten, dass sie unterschiedliche Antworten haben.
Gibt es einen Unterschied zwischen double val = 1;und double val = 1D;?
Nein. Der C # -Compiler erkennt, wenn ein Ganzzahlliteral in einem Kontext verwendet wird, in dem ein Double erwartet wird, und ändert den Typ zur Kompilierungszeit, sodass diese beiden Fragmente denselben Code generieren.
Gibt es einen Unterschied zwischen den folgenden beiden Codeteilen?
double Val;
...
this.Val = src ? 1 : 0;
---
this.Val = src ? 1D : 0D;
Ja. Die Regel, dass ganzzahlige Konstanten automatisch in doppelte Konstanten geändert werden, gilt nur für Konstanten und src ? ...ist keine Konstante . Der Compiler generiert den ersteren so, als hätten Sie geschrieben:
int t;
if (src)
t = 1;
else
t = 0;
this.Val = (double)t;
Und der zweite als
double t;
if (src)
t = 1D;
else
t = 0D;
this.Val = t;
Das heißt, im ersten wählen wir eine Ganzzahl und konvertieren sie dann in double, und im zweiten wählen wir ein double.
Zu Ihrer Information: Der C # -Compiler oder der Jitter dürfen erkennen, dass das erste Programm in das zweite optimiert werden kann, aber ich weiß nicht, ob dies tatsächlich der Fall ist. Der C # Compiler hat manchmal Umwandlungen bewegen für hob in die Körper von conditionals Arithmetik; Ich habe diesen Code vor ungefähr acht Jahren geschrieben, aber ich erinnere mich nicht an alle Details.