2016-06-13 67 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