这个内联为什么是错的?

Ign*_*cia 5 .net c# exception iif cls

如果有以下声明:

return this.revision.HasValue ? this.revision : throw new InvalidOperationException();
Run Code Online (Sandbox Code Playgroud)

我认为它会编译因为throw正在打破正常流程,并且不返回值但不构建它应该不是问题.

有没有办法纠正这个陈述或为什么不允许这样做?

谢谢.

编辑: this.revision是int?并且该方法返回int.

编辑2:如果我有这个方法

public int Test()
{
    throw new Exception();
}
Run Code Online (Sandbox Code Playgroud)

编译器不会抱怨没有返回值,我期望内联中的相同内容如果...至少我们知道可以完成,因为它已经在方法中完成了.

Ric*_*Ric 13

将评论转换为答案:

来自MSDN:

first_expression和second_expression的类型必须相同,或者从一种类型到另一种类型必须存在隐式转换.

?:运营商

由于int?无法转换为异常,因此throw不是表达式,因此代码中存在错误.

  • "我希望计算机违反它的编程并读懂我的想法.请帮助,互联网." (5认同)
  • @SoMoS:编译器是智能的,但它必须遵循规则,一个规则是语法必须有效.如果使用条件运算符,则规则是严格的.如果你不喜欢它,你必须使用`if-else`. (2认同)
  • @Ric这不是类型不匹配,它只是`throw`不是表达式. (2认同)

Chr*_*tos 3

我想问题在于 this.revision 是一个可以为 null 的类型,而 InvalidOperationException() 是一个 SystemException。if 语句中不能有两种不同的类型,例如:

return (a>b)? DateTime.Now : 2;
Run Code Online (Sandbox Code Playgroud)

请看这里:http ://msdn.microsoft.com/en-us/library/vstudio/ty67wk28.aspx

健康)状况 ?第一个表达式:第二个表达式;

条件必须评估为 true 或 false。如果条件为 true,则计算first_expression 并成为结果。如果条件为假,则计算第二个表达式并成为结果。仅计算两个表达式之一。

第一个表达式和第二个表达式的类型必须相同,或者必须存在从一种类型到另一种类型的隐式转换。