C# 为什么这是错误的,如果?
如果有以下声明:C# 为什么这是错误的,如果?,c#,.net,exception,iif,cls,C#,.net,Exception,Iif,Cls,如果有以下声明: return this.revision.HasValue ? this.revision : throw new InvalidOperationException(); 我认为它会编译,因为抛出正在破坏正常的流,不返回值不应该是问题,但它不会生成 有没有办法纠正这种说法,或者为什么不允许这样做 谢谢 编辑:此.revision为int?方法返回int 编辑2:如果我有此方法 public int Test() { throw new Exception(); }
return this.revision.HasValue ? this.revision : throw new InvalidOperationException();
我认为它会编译,因为抛出正在破坏正常的流,不返回值不应该是问题,但它不会生成
有没有办法纠正这种说法,或者为什么不允许这样做
谢谢
编辑:此.revision为int?方法返回int
编辑2:如果我有此方法
public int Test()
{
throw new Exception();
}
编译器不会抱怨没有返回值,我希望内联if也会有同样的结果。。。至少我们知道这可以像在方法中一样完成。我想问题在于,this.revision是一个可为null的类型,InvalidOperationException()是一个系统异常。if语句中不能有两种不同的类型,如:
return (a>b)? DateTime.Now : 2;
请看这里:
状况?第一个表达式:第二个表达式
条件的计算结果必须为true或false。如果条件为true,则计算第一个_表达式并将其作为结果。如果条件为false,则计算第二个_表达式并将其作为结果。只计算两个表达式中的一个
第一个表达式和第二个表达式的类型必须相同,或者必须存在从一种类型到另一种类型的隐式转换。将注释转换为答案: 从MSDN: 第一个_表达式和第二个_表达式的类型必须相同,或者必须存在从一种类型到另一种类型的隐式转换 由于
int?
不能转换为异常,并且throw不是一个表达式,因此代码中会出现错误。这是因为在a中,后两个表达式相互替代,它们的返回值需要具有相同的类型或隐式转换为所分配变量的类型。显然,
异常
与int
具有不同的类型
MSDN:
如果条件为false,将计算第二个\u表达式并将其变为结果
这是因为
?:
的第二个操作数需要是表达式,而不是throw语句
所以你能做的就是-
public static T ThrowException<T>()
{
throw new Exception();
}
公共静态T ThroweException()
{
抛出新异常();
}
并在你的陈述中使用它
return this.revision.HasValue ? this.revision :ThrowException<bool>();
是否返回this.revision.HasValue?this.revision:throweexception();
C#编译器可以实现这一点,而且它可以做比现在更多的事情。问题在于编写该特性并支持它的成本。请参见概述新功能决策过程。方法的返回类型是什么?来自msdn:第一个表达式和第二个表达式的类型必须相同,或者必须存在从一种类型到另一种类型的隐式转换。提供(visual studio)错误消息。乍一看,修订版!=异常。添加了请求的信息,谢谢。throw
不是类型,条件运算符也不是if else
。我希望编译器足够聪明,能够意识到在这种情况下返回值并不重要…@SoMoS三元运算符要求类型相同或隐式可转换“我原以为电脑会违反它的程序,读懂我的心思。@SoMoS:编译器很聪明,但它必须遵循规则,其中一条规则是语法必须有效。如果使用条件运算符,规则是严格的。如果不喜欢,则必须使用If else
@Ric:“int?无法转换为异常,因此代码中会出现错误“即使可以转换为异常,代码也将无效,因为throw
不是异常类型,throw
在条件运算符中是不允许的。作为int?无法转换为异常->错误,根本不是原因。如果OP使用了异常,它也不会工作。@这不是类型不匹配,只是throw
不是表达式。