¿Por qué puedo asignar un literal entero a una variable de tipo corto pero no a un parámetro de método de tipo corto?

¿Por qué puedo hacer esto?

short a = 5;

Pero no esto:

void setNum(short a);

setNum(5);

Arroja:

Posible conversión con pérdida de int a short

Entiendo que 5 es un literal entero y tienes que lanzarlo. También entiendo que si el valor no es una constante, entonces es obvio que necesita arrojar ese error porque tal vez el valor alcanza el límite de un tipo corto. Pero, ¿por qué si el compilador sabe que estoy pasando una constante que un corto puede contener (como en la asignación) no lo deja compilar? Quiero decir, ¿cuál es la diferencia entre ellos?