Są tutaj dwa pytania i należy zauważyć, że mają one różne odpowiedzi.
Czy jest jakaś różnica między double val = 1;i double val = 1D;?
Nie. Kompilator C # rozpoznaje, kiedy literał całkowity jest używany w kontekście, w którym spodziewane jest podwójne, i zmienia typ w czasie kompilacji, więc te dwa fragmenty wygenerują ten sam kod.
Czy istnieje różnica między następującymi dwoma częściami kodu?
double Val;
...
this.Val = src ? 1 : 0;
---
this.Val = src ? 1D : 0D;
Tak. Zasada, że stałe liczb całkowitych są automatycznie zmieniane na liczby podwójne, dotyczy tylko stałych i src ? ...nie jest stała . Kompilator wygeneruje pierwszy tak, jakbyś napisał:
int t;
if (src)
t = 1;
else
t = 0;
this.Val = (double)t;
A drugi jak
double t;
if (src)
t = 1D;
else
t = 0D;
this.Val = t;
Oznacza to, że w pierwszej kolejności wybieramy liczbę całkowitą, a następnie przekształcamy ją na podwojoną, a w drugiej wybieramy podwójną.
Do waszej informacji: kompilator C # lub jitter mogą rozpoznać, że pierwszy program można zoptymalizować do drugiego, ale nie wiem, czy faktycznie to robi. C # kompilator jest czasem przejść konwersje podniesionym arytmetycznych w organach warunkowych; Napisałem ten kod jakieś osiem lat temu, ale nie pamiętam wszystkich szczegółów.