2016-06-13 50 views
3

我有一個隱式變量yesCount,它由一個返回int或小數的三元運算符初始化。隱式變量聲明和三元賦值

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

爲什麼編譯器總是將yesCount編譯爲小數? 推斷這個過程是什麼?

+2

「爲什麼編譯器總是將yesCount編譯爲小數」 - 因爲它必須「always」是* something *(同樣的東西),並且給定int和decimal,優先級規則說'decimal' (隱式與顯式) –

+0

那些演講引用讓我深刻。我現在就放棄職業生涯。謝謝。 – theIrishUser

回答

6

三元運算符,它返回一個int或十進制

這是不正確。三元運算符只能有一個返回類型。因此,編譯器將此返回類型推導爲decimal,因爲您的運算符的secod部分返回decimal,並且第一部分的int可以隱式地被鑄造爲decimal

而且由於該運算符的返回類型爲decimal,因此您的var yesCount也是decimal

+1

@theIrishUser不知道實現細節,但afaik如果類型不同並且類型a隱式可轉換爲類型b,則選擇類型b。如果這兩種類型之間沒有隱式轉換,編譯器會引發錯誤。 –

+0

完美!謝謝 ! – theIrishUser

+1

@theIrishUser對不起,錯誤的鏈接:https://msdn.microsoft.com/en-us/library/aa691313(v=vs.71).aspx –

2

您的三元運算符有兩個操作數:整數和小數。右手操作數是小數,因爲您用m後綴,即decimal

編譯器很聰明,它可以使用隱式轉換來確定哪種類型最適合輸出變量。由於int可隱式轉換爲decimal,但不是相反,decimal是最合適的。 floatdouble也是如此。 double獲勝。

+0

啊,完美,謝謝! – theIrishUser