如果有以下语句:
return this.revision.HasValue ? this.revision : throw new InvalidOperationException();
我认为它会编译为throw破坏了正常的流,不返回值应该不会有问题,但它不会构建。
有没有办法纠正这种说法,或者为什么不允许这样做?
谢谢。
编辑:这个。视觉是int吗?并且该方法返回int.
编辑2:如果我有这种方法
public int Test()
{
throw new Exception();
}
编译器不会抱怨没有返回值,我希望内联中也有同样的东西,如果。。。至少我们知道这是可以做到的,就像在方法中已经做到的那样。
将注释转换为答案:
来自MSDN:
first_expression和second_expression的类型必须相同,或者必须存在从一种类型到另一种类型的隐式转换。
?:操作员
由于int?
无法转换为异常,并且throw不是表达式,因此代码中会出现错误。
我想问题在于this.revision是一个可以为null的类型,InvalidOperationException()是一个SystemException。在if语句中不能有两种不同的类型,例如:
return (a>b)? DateTime.Now : 2;
请看这里:http://msdn.microsoft.com/en-us/library/vstudio/ty67wk28.aspx
条件?first_expression:second_expression;
条件的计算结果必须为true或false。如果条件为true,则计算first_expression并将其作为结果。如果条件为false,则计算second_expression并将其作为结果。仅计算两个表达式中的一个。
first_expression和second_expression的类型必须相同,或者必须存在从一种类型到另一种类型的隐式转换。
这是因为在三元表达式中,后两个表达式充当彼此的替代,它们的返回值需要是相同的类型或隐式转换为被赋值变量的类型
显然,Exception
与int
具有不同的类型。
MSDN:
如果条件为false,则计算second_expression并将其作为结果。
?:
的第二个操作数需要是表达式,而不是throw语句。
所以你能做的就是
public static T ThrowException<T>()
{
throw new Exception();
}
并在您的报表中使用
return this.revision.HasValue ? this.revision :ThrowException<bool>();
C#编译器可以允许这样做,而且它可以做比现在多得多的事情。问题在于编写和支持功能的成本。请参阅Eric Gunnerson的博客文章,概述新功能的决策过程。