隐式变量声明和三元赋值
Implicit variable declaration and ternary assignment
我有一个隐式变量 yesCount
,它由一个三元运算符初始化,returns 一个 int 或一个 decimal。
List<int> simulationsCounters= new List<int>();
simulationsCounters.Add(5);
var yesCount = simulationsCounters.Length > 0
? simulationsCounters[0]
: 0m;
为什么编译器总是将 yesCount 编译为小数?
这是经过什么过程推导出来的?
a ternary operator which returns an int or a decimal
事实并非如此。三元运算符只能有 one return 类型。所以编译器将此 return 类型推断为 decimal
,因为你的运算符 return 的第二部分是 decimal
并且第一部分的 int
可以 隐式 转换为 decimal
.
并且由于该运算符的 return 类型是 decimal
,因此您的 var yesCount
也是 decimal
。
您的三元运算符有两个操作数:一个整数和一个小数。右边的操作数是小数,因为你用 m
后缀,这意味着 decimal
.
编译器非常聪明,它可以使用隐式强制转换来确定哪种类型最适合输出变量。由于 int
可以隐式转换为 decimal
,但反之则不行,因此 decimal
是最合适的。 float
与 double
也是如此。 double
获胜。
我有一个隐式变量 yesCount
,它由一个三元运算符初始化,returns 一个 int 或一个 decimal。
List<int> simulationsCounters= new List<int>();
simulationsCounters.Add(5);
var yesCount = simulationsCounters.Length > 0
? simulationsCounters[0]
: 0m;
为什么编译器总是将 yesCount 编译为小数? 这是经过什么过程推导出来的?
a ternary operator which returns an int or a decimal
事实并非如此。三元运算符只能有 one return 类型。所以编译器将此 return 类型推断为 decimal
,因为你的运算符 return 的第二部分是 decimal
并且第一部分的 int
可以 隐式 转换为 decimal
.
并且由于该运算符的 return 类型是 decimal
,因此您的 var yesCount
也是 decimal
。
您的三元运算符有两个操作数:一个整数和一个小数。右边的操作数是小数,因为你用 m
后缀,这意味着 decimal
.
编译器非常聪明,它可以使用隐式强制转换来确定哪种类型最适合输出变量。由于 int
可以隐式转换为 decimal
,但反之则不行,因此 decimal
是最合适的。 float
与 double
也是如此。 double
获胜。