为什么这个内联是错误的如果



如果有以下语句:

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的类型必须相同,或者必须存在从一种类型到另一种类型的隐式转换。

这是因为在三元表达式中,后两个表达式充当彼此的替代,它们的返回值需要是相同的类型或隐式转换为被赋值变量的类型
显然,Exceptionint具有不同的类型。

MSDN:

如果条件为false,则计算second_expression并将其作为结果

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

所以你能做的就是

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

并在您的报表中使用

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

C#编译器可以允许这样做,而且它可以做比现在多得多的事情。问题在于编写和支持功能的成本。请参阅Eric Gunnerson的博客文章,概述新功能的决策过程。

相关内容

  • 没有找到相关文章

最新更新