Здесь есть два вопроса, и важно отметить, что у них разные ответы.
Есть ли разница между double val = 1;и double val = 1D;?
Нет. Компилятор C # распознает, когда целочисленный литерал используется в контексте, где ожидается double, и изменяет ли тип во время компиляции, поэтому эти два фрагмента будут генерировать один и тот же код.
Есть ли разница между следующими двумя частями кода?
double Val;
...
this.Val = src ? 1 : 0;
---
this.Val = src ? 1D : 0D;
Да. Правило, согласно которому целочисленные константы автоматически изменяются на двойные, применяется только к константам и src ? ...не является константой . Компилятор сгенерирует первый, как будто вы написали:
int t;
if (src)
t = 1;
else
t = 0;
this.Val = (double)t;
А второй как
double t;
if (src)
t = 1D;
else
t = 0D;
this.Val = t;
То есть, в первом мы выбираем целое число, а затем конвертируем его в двойное, а во втором мы выбираем двойное.
К вашему сведению: компилятору C # или джиттеру разрешено распознавать, что первую программу можно оптимизировать во вторую, но я не знаю, так ли это на самом деле. C # компилятор делает иногда двигаться преобразованиями для поднятого арифметики в органы условных; Я написал этот код около восьми лет назад, но я не помню все детали.