2016-06-13 17 views
3

Ich habe eine implizite Variable yesCount, die von einem ternären Operator initialisiert wird, der ein int oder eine Dezimalzahl zurückgibt.Implizite Variablendeklaration und ternäre Zuweisung

List<int> simulationsCounters= new List<int>(); 
simulationsCounters.Add(5); 
var yesCount = simulationsCounters.Length > 0 
    ? simulationsCounters[0] 
    : 0m; 

Warum kompiliert der Compiler yesCount immer als Dezimalzahl? Welchen Prozess folgt daraus, um dies abzuleiten?

+2

"Warum kompiliert der Compiler immer yesCount als Dezimalzahl" - weil es "immer" sein muss * etwas * (das gleiche Etwas) und gegeben 'int' und' dezimal', die Vorrangregeln sagen 'dezimal' (implizit vs explizit) –

+0

Diese Rede Zitate schneiden mich tief. Ich werde jetzt eine Karriere aufgeben. Vielen Dank. – theIrishUser

Antwort

6

ein ternärer Operator, der

ein int oder eine Dezimalzahl zurückgibt, das nicht wahr ist. Der ternäre Operator kann nur einen Rückgabetyp haben. Daher leitet der Compiler diesen Rückgabetyp als decimal ab, weil der Secod-Teil Ihres Operators eine decimal zurückgibt und die int des ersten Teils implizit an decimal übergeben werden kann.

Und da der Rückgabetyp dieses Bedieners decimal ist, ist auch Ihr var yesCount ein decimal.

+1

@theIrishUser kennen die Implementierungsdetails nicht, aber afaik, wenn die Typen unterschiedlich sind und Typ a implizit zu Typ b umsetzbar ist, dann wählt sie Typ b. Wenn zwischen diesen beiden Typen keine implizite Konvertierung stattfindet, löst der Compiler einen Fehler aus. –

+0

Perfekt! Vielen Dank ! – theIrishUser

+1

@theIrishUser Entschuldigung, falscher Link: https://msdn.microsoft.com/en-us/library/aa691313(v=vs.71).aspx –

2

Ihr ternärer Operator hat zwei Operanden: eine ganze Zahl und eine Dezimalzahl. Der rechte Operand ist eine Dezimalzahl, da Sie ihn mit m postfixen, was decimal bedeutet.

Der Compiler ist so intelligent, dass er die impliziten Umwandlungen verwenden kann, um zu bestimmen, welcher Typ am besten für die Ausgabevariable passt. Da eine int implizit auf eine decimal geworfen werden kann, aber nicht umgekehrt, ist eine decimal die beste Lösung. Dasselbe gilt für float vs. double. Die double gewinnt.

+0

Aah, Perfekt, Danke! – theIrishUser