1

可能重复:
为什么这段代码在 C# 中无效?
条件运算符不能隐式转换?

如果我执行以下操作:

bool someBool = false;
uint value = 0;

这些很好:

value = (someBool) ? 0 : (uint)1;
value = (someBool) ? (uint)0 : 1;

但这不是:

value = (someBool) ? 0 : 1;

当我可以轻松地说:为什么我不能使用最后一个:

value = 0;
value = 1;

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

4

3 回答 3

4

您必须将其转换为,uint以便编译器知道。0 和 1 都可以是 auint或 an int

这是语言规范(可以从 MSDN 下载

?: 运算符的第二个和第三个操作数控制条件表达式的类型。设 X 和 Y 是第二个和第三个操作数的类型。然后,

如果 X 和 Y 是相同的类型,那么这是条件表达式的类型。

否则,如果存在从 X 到 Y 的隐式转换,但不存在从 Y 到 X 的转换,则 Y 是条件表达式的类型。

否则,如果存在从 Y 到 X 的隐式转换,但不存在从 X 到 Y 的转换,则 X 是条件表达式的类型。

否则,无法确定表达式类型,并出现编译时错误。

于 2012-06-14T19:34:58.703 回答
1

如果您不将任何数字转换为uint,编译器将假定三元运算符的结果是int,它不能隐式转换为uint

于 2012-06-14T19:35:37.817 回答
1

我的简短总结:

  var x = c ? a : b;

编译器将尝试 ifb可转换为 的类型a,否则将尝试 if 可转换a为 的类型b。当两者都不可能时,就会出现错误。

但在

 uint value = (someBool) ? 0 : 1;

三元运算符简单地返回int(两者a都是b整数)。

确定类型时不考虑赋值左侧的变量。

于 2012-06-14T19:36:45.083 回答