5

如果有以下语句:

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

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

有没有办法纠正这个声明或者为什么不允许这样做?

谢谢。

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

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

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

编译器不会抱怨没有返回一个值,我期望内联的事情是一样的 if ... 至少我们知道可以做到,因为它已经在方法中完成了。

4

5 回答 5

13

将评论转换为答案:

来自 MSDN:

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

?: 操作员

Asint?不能转换为异常,并且 throw 不是表达式,因此代码中的错误。

于 2013-11-22T10:44:34.837 回答
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 并成为结果。仅计算两个表达式中的一个。

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

于 2013-11-22T10:44:02.117 回答
2

这是因为在三元表达式中,后两个表达式可以相互替代,并且它们的返回值需要具有相同的类型或隐式转换为被分配变量的类型。
显然, an 的Exception类型与 a 不同int

MSDN:

如果条件为假,则计算 second_expression 并成为结果

于 2013-11-22T10:46:32.357 回答
1

C# 编译器可以做到这一点,它可以做比现在更多的事情。问题是编写功能然后支持它的成本。请参阅Eric Gunnerson 的博客文章,其中概述了新功能决策过程。

于 2013-11-22T11:01:53.050 回答
1

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

所以你能做的是——

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

并在你的陈述中使用它

return this.revision.HasValue ? this.revision :ThrowException<bool>();
于 2013-11-22T10:49:37.130 回答