Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么这是错误的,如果?_C#_.net_Exception_Iif_Cls - Fatal编程技术网

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
不是表达式。