2013-11-22 48 views
5

如果有下面的语句:为什么这个内联错了?

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

我认为是抛出是打破正常流程将编译,它不应该是没有返回值的问题,但它并没有建立。

有没有办法把这个陈述正确或为什么不允许?

谢谢。

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

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

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

编译器不会抱怨没有返回值,我预计从行内同样的事情,如果......至少我们知道,可以因为它已经在方法中完成了。

+2

什么是你的方法的返回类型? – Christos

+4

从msdn:第一个表达式和第二个表达式的类型必须相同,或者从一个类型到另一个类型必须存在隐式转换。 http://msdn.microsoft.com/en-us/library/ty67wk28(v=vs.110).aspx – Ric

+1

提供您的(视觉工作室)错误信息。乍一看,修正!=例外。 – mnemonic

回答

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将被计算并成为结果。如果条件为false,则second_expression将被计算并成为结果。只有两个表达式中的一个被评估。

第一个表达式和第二个表达式的类型必须是相同的,或者必须存在从一种类型到另一种类型的隐式转换。

+0

我希望编译器足够聪明,以实现在这种情况下,返回值无关紧要... –

+0

@SoMoS三元运算符要求类型是相同或可隐式转换http://msdn.microsoft.com/ en-us/library/ty67wk28%28v = vs.110%29.aspx – Gusdor

13

转换评论到应答:

从MSDN:

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

?: Operator

int?不能转换到一个异常,并抛出不是表达式,因此代码中的错误。

+0

同样,我希望编译器足够聪明,可以认识到在这种情况下,返回值并不重要......检查我的编辑 –

+0

,但它略微不同于传统的if..else声明,因为它的类型必须匹配或能够转换为赋值。 – Ric

+5

“我希望计算机违反它的编程规则并阅读我的想法,请帮助,互联网。” – Gusdor

2

这是因为在ternary expression中,后两个表达式相互替代,它们的返回值需要是相同类型或可以隐式转换为所分配变量的类型。
显然,Exceptionint类型不同。

MSDN:

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

1

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

所以你可以做是 -

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

什么,并用它在你的发言

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

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

+0

当您投票时请留下评论... – ya23

相关问题