隐式变量声明和三元赋值

3
我有一个隐式变量yesCount,它由一个三元运算符初始化,该运算符返回一个整数或一个小数。
List<int> simulationsCounters= new List<int>();
simulationsCounters.Add(5);
var yesCount = simulationsCounters.Length > 0
     ? simulationsCounters[0]
     : 0m;

为什么编译器总是将yesCount编译为十进制?它遵循了哪个过程来推断这一点?

2
为什么编译器总是将yesCount编译为十进制数?因为它必须始终是某种类型(相同的类型),而在int和decimal之间,优先级规则表明是decimal(隐式与显式)。 - Marc Gravell
那些言论伤害了我很深。我现在就放弃职业吧。谢谢。 - theUser
2个回答

6
一个三元操作符,它返回一个整数或十进制数。这是不正确的。三元操作符只能有一个返回类型。所以编译器推断这个返回类型为decimal,因为你操作符的第二部分返回一个decimal,第一部分的int可以被隐式转换成decimal。由于该操作符的返回类型为decimal,因此您的var yesCount也是decimal。

1
@theIrishUser 不知道具体的实现细节,但据我所知,如果类型不同且类型a可以隐式转换为类型b,则会选择类型b。如果这两种类型之间没有隐式转换,编译器将会报错。 - René Vogt
完美!谢谢! - theUser
1
@theIrishUser 抱歉,链接错误:https://msdn.microsoft.com/zh-cn/library/aa691313(v=vs.71).aspx - Marc Gravell

2
你的三元运算符有两个操作数:一个整数和一个小数。右操作数是小数,因为你用 m 作为后缀,表示它是小数。
编译��非常聪明,它可以使用隐式转换来确定哪种类型最适合输出变量。由于 int 可以被隐式转换为 decimal,但反过来不行,所以 decimal 是最佳选择。对于 floatdouble,同样也是如此。这时候,double 获胜。

啊,完美的,谢谢! - theUser

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接