可能重复:
Why is this code invalid in C#?
Conditional operator cannot cast implicitly?
如果我执行以下操作:
bool someBool = false;
uint value = 0;
这些都很好:
value = (someBool) ? 0 : (uint)1;
value = (someBool) ? (uint)0 : 1;
但这不是:
value = (someBool) ? 0 : 1;
为什么我可以轻易地说:
,我不能使用最后一个value = 0;
value = 1;
如何确定三元运算符的类型?
答案 0 :(得分:4)
您必须将其强制转换为uint
,以便编译器知道。 0和1都可以是uint
或int
。
以下是语言规范(可从MSDN here下载):
?:运算符的第二个和第三个操作数控制的类型 条件表达式。设X和Y为第二个和第二个的类型 第三个操作数。然后,
如果X和Y是相同的类型,那么这是条件的类型 表达
否则,如果从X到Y存在隐式转换, 但不是从Y到X,那么Y是条件表达式的类型。
否则,如果存在从Y到X的隐式转换,而不是来自 X到Y,则X是条件表达式的类型。
否则,无法确定表达式类型,并发生编译时错误。
答案 1 :(得分:1)
如果你没有将任何数字转换为uint
,编译器将假设三元运算符的结果是int
,不能隐式转换为uint
}。
答案 2 :(得分:1)
我的简短摘要:
var x = c ? a : b;
如果b
可转换为a
类型,编译器将尝试,否则如果a
可转换为b
类型。如果两者都不可能,则会出错。
但是在
uint value = (someBool) ? 0 : 1;
三元运算符只需返回int
(此处a
和b
都是整数。
在确定类型时,分配左侧的变量是不。