这个内联为什么是错的?

时间:2013-11-22 10:39:41

标签: c# .net exception iif cls

如果有以下声明:

return this.revision.HasValue ? this.revision : throw new InvalidOperationException();

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

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

感谢。

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

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

public int Test()
{
    throw new Exception();
}

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

5 个答案:

答案 0 :(得分:13)

将评论转换为答案:

来自MSDN:

  

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

?: Operator

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

答案 1 :(得分:3)

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

return (a>b)? DateTime.Now : 2;

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

条件? first_expression:second_expression;

条件必须评估为真或假。如果condition为true,则计算first_expression并将其作为结果。如果condition为false,则计算second_expression并成为结果。只评估两个表达式中的一个。

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

答案 2 :(得分:2)

这是因为在ternary expression中,后两个表达式相互替代,它们的返回值必须是相同的类型,或者可以隐式转换为被赋值变量的类型。
显然,Exception的类型与int不同。

<强> MSDN:

  

如果条件为假,则 second_expression将被评估并成为结果

答案 3 :(得分:1)

这是因为?:的第二个操作数需要是一个表达式,而不是一个throw语句。

所以你可以做的是 -

public static T ThrowException<T>()
{
    throw new Exception();
}

并在你的陈述中使用它

return this.revision.HasValue ? this.revision :ThrowException<bool>();

答案 4 :(得分:1)

C#编译器可以允许这样做,它可以做比现在更多的事情。问题是编写功能然后支持它的成本。请参阅Eric Gunnerson's blog post概述新功能决策流程。