我可以从三元操作中得到什么类型?

时间:2012-06-14 19:33:04

标签: c# ternary-operator

  

可能重复:
  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;

如何确定三元运算符的类型?

3 个答案:

答案 0 :(得分:4)

您必须将其强制转换为uint,以便编译器知道。 0和1都可以是uintint

以下是语言规范(可从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(此处ab都是整数。

在确定类型时,分配左侧的变量是