Dies ist eine ziemlich häufig gestellte Frage.
In C#, wir fast immer von innen nach außen Grund. Wenn Sie
x = y;
sehen wir herausfinden, was die Art von x ist, was ist die Art von y, und ob die Art der y Zuordnung mit x kompatibel. Aber wir nutzen nicht die Tatsache, dass wir wissen, was der Typ von x ist, wenn wir den Typ von y ausarbeiten.
, dass, weil es könnte mehr sein als ein x:
void M(int x) { }
void M(string x) { }
...
M(y); // y is assigned to either int x or string x depending on the type of y
Wir Notwendigkeit der Lage sein, den Typ eines Ausdrucks arbeiten ohne zu wissen, was es zugewiesen wird.Typ Informationsflüsse aus eines Ausdrucks, nicht in ein Ausdruck.
Um den Typ des Bedingungsausdrucks zu ermitteln, berechnen wir den Typ der Konsequenz und die alternativen Ausdrücke, wählen den allgemeineren der beiden Typen aus, und dies wird zum Typ des Bedingungsausdrucks. In Ihrem Beispiel ist der Typ des Bedingungsausdrucks "int" und keine Konstante (es sei denn, der Bedingungsausdruck ist konstant wahr oder konstant falsch). Da es keine Konstante ist, können Sie es nicht Byte zuweisen; der Compiler begründet sich ausschließlich aus den Typen, nicht aus den Werten, wenn das Ergebnis keine Konstante ist.
Die Ausnahme von all diesen Regeln sind Lambda-Ausdrücke, wobei die Typinformation von dem Kontext in das Lambda fließt. Es war sehr schwierig, diese Logik richtig zu machen.
mögliche Duplikate von [Nurable Typen und der ternäre Operator: warum ist \ '? 10: null \ 'verboten?] (Http://stackoverflow.com/questions/858080/nullable-types-and-the-ternary-operator-why-is-10-null-forbidden) – nawfal