为什么我不能有这样的东西:
Some_Function ? myList.Add(a) : throw new Exception();
为什么我不能在?:operator的else部分抛出异常? ?:operator?
的主要目的是什么?建议 如果有人想知道同样的事情,除了阅读下面的答案,我建议你也阅读这篇文章.. Expression Versus Statement
答案 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 value(List.Add()
是void
而且异常也没有评估为某个值),因此无法编译
答案 2 :(得分:2)
您需要记住,Ternary运算符必须返回一些内容而List.Add
是void
方法,因此它会失败。双方必须兼容并且应该返回一些东西。
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语句,然后使用条件运算符将整数分类为正数或负数。