预期在?:运算符中的表达式

时间:2014-08-29 11:45:00

标签: c# if-statement

为什么我不能有这样的东西:

Some_Function ? myList.Add(a) : throw new Exception();

为什么我不能在?:operator的else部分抛出异常? ?:operator?

的主要目的是什么?

建议 如果有人想知道同样的事情,除了阅读下面的答案,我建议你也阅读这篇文章.. Expression Versus Statement

4 个答案:

答案 0 :(得分:6)

其他答案和评论当然是正确的(我们可以参考documentation),虽然我对问题的理解更像是,"为什么必须这样?&# 34。

根据C# 5.0 specification,条件运算符形成表达式,而不是语句。我怀疑它之所以不是语句,从而阻止你做a ? b() : throw e这样的事情,仅仅是因为我们已经有了一个语句结构来实现基本相同的东西;即if..else

if (a) { b(); } else { throw e; }

条件运算符的好处是它可以在语句或其他表达式中使用。

bool? nb = GetValue();
if (nb ?? (a ? b() : c())) { throw e; }

答案 1 :(得分:3)

因为它被定义为:

null-coalescing-expression ? expression : expression

您可以阅读?: Operator (C# Reference)

  

条件运算符(?:) 返回两个值中的一个,具体取决于布尔表达式的值。

根据 null-coalescing-expression 的布尔值评估其中一个表达式

由于您的两个代码片段都不是expressions that evaluate to a valueList.Add()void而且异常也没有评估为某个值),因此无法编译

答案 2 :(得分:2)

您需要记住,Ternary运算符必须返回一些内容而List.Addvoid方法,因此它会失败。双方必须兼容并且应该返回一些东西。

MSDN说:

  

条件必须评估为真或假。如果条件为真,   评估 first_expression 并成为结果。如果条件是   false, second_expression 将被评估并成为结果。

并且myList.Add(a)不是表达式。

答案 3 :(得分:1)

请参阅 ?: Operator on MSDN 。它在那里清楚地解释了。

条件运算符(?:)根据布尔表达式的值返回两个值中的一个。以下是条件运算符的语法。

条件? first_expression:second_expression;

条件必须评估为真或假。如果condition为true,则计算first_expression并将其作为结果。如果condition为false,则计算second_expression并成为结果。只评估两个表达式中的一个。 first_expression和second_expression的类型必须相同,或者从一种类型到另一种类型必须存在隐式转换。 通过使用条件运算符,您可以更简洁地表达可能需要if-else结构的计算。例如,以下代码首先使用if语句,然后使用条件运算符将整数分类为正数或负数。

条件运算符(?:)根据布尔表达式的值返回两个值中的一个。以下是条件运算符的语法。

条件必须评估为真或假。如果condition为true,则计算first_expression并将其作为结果。如果condition为false,则计算second_expression并成为结果。只评估两个表达式中的一个。 first_expression和second_expression的类型必须相同,或者从一种类型到另一种类型必须存在隐式转换。 通过使用条件运算符,您可以更简洁地表达可能需要if-else结构的计算。例如,以下代码首先使用if语句,然后使用条件运算符将整数分类为正数或负数。