Тут є два питання, і важливо зазначити, що вони мають різні відповіді.
Чи є різниця між double val = 1;і double val = 1D;?
Ні. Компілятор C # розпізнає, коли використовується цілий літерал у контексті, коли очікується подвійне і чи змінюється тип під час компіляції, тож ці два фрагменти будуть генерувати той самий код.
Чи є різниця між наступними двома фрагментами коду?
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;
Тобто в першому ми вибираємо ціле число, а потім перетворюємо його в подвійне, а в другому вибираємо подвійне.
FYI: компілятор C # або тремтіння дозволяють визнати, що перша програма може бути оптимізована під другу, але я не знаю, чи це насправді так. C # компілятор робить іноді рухатися перетвореннями для піднятого арифметики в органи умовних; Я написав цей код десь вісім років тому, але не пам'ятаю всіх подробиць.