C#求助:并非所有的代码路径都返回值

本文介绍了错误CS0161的原因:并非所有的代码路径返回值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

我做了一个基本的扩展方法来重试功能添加到我的 HttpClient.PostAsync

上面的代码让我以下错误:

如果我想补充抛出新的InvalidOperationException异常()末(或返回NULL 为此事),错误消失预期。我真正想知道的是:是否有被抛出,实际上退出这个方法没有或者是返回值或异常的代码路径?我无法看到它。难道我比在这种情况下,编译器的更多,或者是周围的其他方式?

简单的原因是,编译器必须能的静态验证的所有执行流程路径结束了一个return语句(或者一个例外)。

让我们来看看你的代码,它包含:



  • A ,而循环,用收益语句嵌入

  • 收益语句的之后的循环

所以基本上编译器来验证这些事情:


  1. 收益语句的总是的执行
  2. 或者的一些例外总是而是抛出。

编译器根本无法。验证这个

让我们尝试一个很简单的例子:

这简单的例子会产生完全相同的错误:

CS0161'测试()':不是所有的代码路径返回一个值

因此,编译器不能推断,因为这些事实:


  • A 是一个局部变量(即只有本地代码会影响它)

  • A 有一个初始值 1 ,并且从来没有改变过

  • 如果在 A 变量大于零(这它是),在收益达到语句

那么代码将永远。返回值10

现在看看下面这个例子:

唯一不同的是我做了 A A 常量。现在它编译,但是这是因为优化器现在可以删除整个循环,最终的IL仅仅是这样的:

整个,而循环和局部变量消失了,所有剩下就是这样的:

所以很明显,编译器不看变量的值时,静态地分析了这些东西。实现此功能,并得到它的权利可能超过了效果还是没有这样做的缺点的成本。请记住,。

所以,是的,这绝对是一个案例你知道更多关于代码比编译器在哪里。

只是为了保持完整性,让我们来看看你的代码可以在所有的方法流量:


  1. 它可以与异常提前退出,如果 maxAttempts 小于1
  2. 如果里面的尝试语句抛出一个 HttpRequestException 然后尝试递增,若仍小于或等于小于 maxAttempts,而 -loop会做另一个循环。如果现在是不是 maxAttempts 的异常将泡沫了。
  3. 如果一些其他的异常被抛出,它不会做大的处理,并将泡出来的方法
  4. 。如果没有抛出异常,返回的响应。

所以基本上,这个代码可以说是最后总是要么抛出异常或返回,但是编译器不能静态地验证这一点。

既然你已经嵌入逃生舱口(尝试与GT; maxAttempts )在两个地方,无论是作为 -loop,另外的块我会被刚刚从,而 -loop:

既然你保证运行,而 -loop至少一次,而且它实际上是在块退出,只是说形式化和。编译器会重新快乐起来。

现在流量控制是这样的:


  • ,而循环会的总是的执行(或者我们已经抛出异常)

  • ,而循环会的从不的终止(没有里面,所以没有必要在循环之后的任何代码)

  • 要退出循环,唯一可行的方法是一个显式收益或异常,无论它的编译器有验证了,因为这个特殊的错误消息的重点是标志,有可能是为了躲避方法没有明确的收益的一种方式。由于没有办法逃避偶然的检查任何更多的其余部分可以简单地跳过该方法

这篇关于错误CS0161的原因:并非所有的代码路径返回值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

这么和你说吧,你定义 了一个有返回值的函数,那么就一定要有返回值,现在是你只在TRY里返回了,如果当然try不成功(就是有错,有异常),那么就要中间断开,goto到catch,这样try里就没有返回,现在你catch里又没有返回,到函数最后也没有,那么这个函数到最后都没有返回值,如果编译器认你通过的话,如果try 出现异常,那么这个函数就不会有返值,那就是说函数没有停止,也就是说,如何在这一线程下的就这样停止,如果是主线程的话那就是程序卡在这里了,没反响, 以上都是一些啰嗦话,明白就好,像try catch 和if else 等一些判断语句,多个的还是一个的,只要函数返回值不是void 那么 每个判断都要有return .当然了如果在函数最后return 以上的都是废话
这个方法需要一个返回值 就是需要return一个东西出来 
实在不需要返回的话 就在方法最后补上 return "";

我要回帖

更多关于 java中return返回值怎么接收 的文章

 

随机推荐