如果有以下声明:
return this.revision.HasValue ? this.revision : throw new InvalidOperationException();
我认为它会编译,因为throw正在打破正常流程,并且不返回值但不构建它应该是一个问题。
有没有办法纠正这个陈述或为什么不允许这样做?
感谢。
编辑: this.revision是int?并且该方法返回int。
编辑2:如果我有这个方法
public int Test()
{
throw new Exception();
}
编译器没有抱怨没有返回值,我期望内联中的相同内容如果...至少我们知道可以完成,因为它已经在方法中完成了。
答案 0 :(得分:13)
将评论转换为答案:
来自MSDN:
first_expression和second_expression的类型必须相同,或者从一种类型到另一种类型必须存在隐式转换。
由于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概述新功能决策流程。