¿Por qué el compilador decide que 2.3 es doble y no decimal?

¿Por qué el compilador decide que 2.3 es doble, por lo que este código no se compilará?

decimal x;
x = 2.3; // Compilation error - can not convert double to decimal.
x = (decimal) 2.3 // O.k.

Por qué el compilador no piensa así:
Quiere obtener un decimal, me da un valor que puede ser decimal, ¡así que es decimal!

Y por qué esto no recibe un error de compilación:

short x;
x = 23; // O.K.

¿Quién dijo que 23 no es un int?

Respuestas a la pregunta(8)

Su respuesta a la pregunta