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.