Erforderliches Casting mit dem C # -ternären bedingten Operator

Ich versuche in den folgenden Beispielen herauszufinden, warum Casts erforderlich sind:

bool test = new Random().NextDouble() >= 0.5;
short val = 5;

// Ex 1 - must cast 0 to short
short res = test ? 5 : 0;  // fine
short res = test ? val : 0;  // error
short res = test ? val : (short)0;  // ugly

// Ex 2 - must cast either short or null to short?
short? nres = test ? val : null;  // error
short? nres = test ? (short?)val : null;  // ugly
short? nres = test ? val : (short?)null;  // ugly
short? nres = test ? val : default(short?);  // ugly

Das erste Beispiel kommt mir einfach verrückt vor. Wennshort i = 0; kompiliert, warum kann der Compiler die 0 (oder ein anderes gültiges @ nicht implizit behandelshort value) alsshort im obigen Code?

Das zweite Beispiel macht für mich mehr Sinn. Ich verstehe, dass der Compiler den Typ des Ausdrucks auf der rechten Seite des @ nicht bestimmen kan=, aber IMO sollte es nullfähige Typen berücksichtigen, wenn Sie dies tun.

Ich würde gerne verstehen, ob diese Compilerfehler tatsächlich begründet sind.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage