- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我已经做了一个基本的扩展方法来为我的 HttpClient.PostAsync
添加重试功能:
public static async Task<HttpResponseMessage> PostWithRetryAsync(this HttpClient httpClient, Uri uri, HttpContent content, int maxAttempts, Action<int> logRetry)
{
if (maxAttempts < 1)
throw new ArgumentOutOfRangeException(nameof(maxAttempts), "Max number of attempts cannot be less than 1.");
var attempt = 1;
while (attempt <= maxAttempts)
{
if (attempt > 1)
logRetry(attempt);
try
{
var response = await httpClient.PostAsync(uri, content).ConfigureAwait(false);
response.EnsureSuccessStatusCode();
return response;
}
catch (HttpRequestException)
{
++attempt;
if (attempt > maxAttempts)
throw;
}
}
}
Error CS0161 'HttpClientExtensions.PostWithRetryAsync(HttpClient, Uri, HttpContent, int, Action)': not all code paths return a value.
throw new InvalidOperationException()
最后(或
return null
就此而言),错误按预期消失。我真正想知道的是:是否有任何代码路径实际退出此方法而没有返回值或抛出异常?我看不到。在这种情况下,我是否比编译器了解的更多,还是相反?
最佳答案
原因很简单,编译器必须能够静态验证所有执行流路径是否以 return 语句(或异常)结束。
让我们看看你的代码,它包含:
while
的一些变量循环 while
循环,带有 return
语句嵌入return
循环后的语句 while
循环实际执行 return
语句总是被执行 public int Test()
{
int a = 1;
while (a > 0)
return 10;
}
CS0161 'Test()': not all code paths return a value
a
是一个局部变量(意味着只有局部代码可以影响它)a
初始值为 1
,并且永远不会改变 a
变量大于零(它是),return
声明已达成 public int Test()
{
const int a = 1;
while (a > 0)
return 10;
}
a
const
.现在它编译了,但这是因为优化器现在能够删除整个循环,最终的 IL 是这样的:
Test:
IL_0000: ldc.i4.s 0A
IL_0002: ret
while
循环和局部变量消失了,剩下的就是这个:
return 10;
maxAttempts
,它可以提前退出,但有一个异常(exception)。小于 1 while
-循环自 attempt
是 1 和 maxAttempts
至少为 1。try
语句抛出 HttpRequestException
然后 attempt
递增,如果仍然小于或等于 maxAttempts
while
-loop 将进行另一次迭代。如果它现在大于 maxAttempts
异常会冒泡。 attempt > maxAttempts
),这两个位置都是
while
的标准。 -loop,另外还有
catch
我会通过从
while
中删除它来简化代码-环形:
while (true)
{
...
if (attempt > maxAttempts)
throw;
...
}
while
- 至少循环一次,它实际上是
catch
退出它的块,只需形式化它,编译器就会再次高兴。
while
循环将始终执行(或者我们已经抛出异常)while
循环永远不会终止(内部没有 break
,所以循环后不需要任何代码)return
或异常,编译器不必再验证这两种情况,因为此特定错误消息的重点是标记有可能在没有显式 return
的情况下转义该方法的方法。 .由于无法再意外地逃避该方法,因此可以简单地跳过其余的检查。public int Test()
{
while (true)
{
}
}
关于c# - 错误原因 CS0161 : not all code paths return a value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33606833/
我有 2 个 .cs 文件,每个文件中都有一个类。如何在 Form2.cs 中的另一个类中调用 Form1.cs 中的一个类中的方法? 看起来像这样...... Form1.cs public par
我正在尝试了解指针的移动方式。以下是程序,我知道如果 int cs={1,2,3}; 然后cs指向cs[0]我不清楚的是 *cs 指向什么。 #include int main() {
我是 ASP.NET Core 新手。我正在使用 ASP.NET Core 7。我读到在 ASP.NET Core 7 中他们删除了 Startup.cs。有人可以告诉我如何在此示例中将 Startu
所以我知道一般来说,这是不可能的,因为Jon Skeet said so . 但是我的 .cs 文件是简单的类,在顶部有一个或两个 usings。我需要一个包含所有类的文件,这样我就可以将它作为单个文
到目前为止,基本上我的脚本将值发送到网关,然后被重定向到 CS 购物车。在该页面中,我获取返回的值并对其进行操作。 我使用 fn finish 和 fn 更改订单状态来完成订单,但无论我做什么,我都会
我需要一个匹配所有以 .cs 结尾的字符串的正则表达式,但如果它们以 .g.cs 结尾,则它们不应该匹配。我正在使用 .NET 正则表达式。 最佳答案 如果是 .cs 而不是 .g.cs,这将匹配结尾
到目前为止,基本上我的脚本将值发送到网关,然后被重定向到 CS 购物车。在该页面中,我获取返回的值并对其进行操作。 我使用 fn finish 和 fn 更改订单状态来完成订单,但无论我做什么,我都会
我的 Form.cs 中有一个函数,我想在我的 program.cs 中调用它 但是如果函数不是静态的,program.cs就不能用了。如果它是静态的,则 Form.cs 无法使用它,因为它涉及非静态
因此,当我抓取不同解决方案的一些文件并将它们粘贴到不同的解决方案中时,我的 Mainform 和设计师分离了。如果我运行我的程序,表格会正确显示,但是当我在设计模式下查看我的表格时,它是一个空白表格。
我有一个用户控件 (UserControl1.ascx),我对其 cs 文件进行了更改。UserControl1.ascx 正被两个或多个使用 LoadControl 的 aspx 文件使用.我不想部
我正在学习一些 Xamarin 开发。当我研究 Xamarin 项目的例子时,like this one ,我有时会看到一个页面有一个与 xaml 文件及其代码隐藏文件同名的神秘文件,但以 *CS.c
是的,这有点毫无意义,但我想知道......我的 MVC 应用程序中所有这些代码隐藏文件都困惑了。据我所知,我需要这些文件的唯一原因是告诉 ASP.NET 我的页面是从 ViewPage 而不是 Pa
我已经从一个不再可用的人那里继承了一个网站。在已部署的文件夹中,我有 Config.aspx(请参阅代码)。但是我找不到代码隐藏文件。配置页面有效。我在哪里可以找到 .cs 文件? 谢谢
在为 Outlook(或其他潜在的 Office 程序)开发插件时,在主类上调用方法可能很有用,但是如何从事件处理程序(例如功能区中的 button_click 事件)中执行此操作。 最佳答案 使用:
我已经创建了 PlayPage.xaml、PlayPage.xaml.cs 和 Game.cs 文件。PlayPage.xaml.cs 有两个变量,windowWidth 和 windowHeight
我一直在关注使用 Caliburn Micro 的 MVVM 模式教程 https://www.youtube.com/watch?v=laPFq3Fhs8k .xaml.cs 和 ViewModel
我试图将一个值(来自一个对象)放在一个变量中,并将它放在一个表单的文本框中。 表单代码如下: public Form1(Deck mainDeck) { InitializeC
我知道这很基础,但我找不到任何关于如何在 MSDN、Google 搜索和 stackoverflow 之间执行此操作的指南/教程。 我创建了一个新的 Windows 窗体应用程序,这里我有 Progr
VS2017 15.4.1 ASP.NET MVC 5.2.3 T4MVC 4.0.0 AutoT4MVC 1.5.3 再加工者 我在这个项目中已经使用 T4MVC] 好几个月了,没有任何问题。然而,
我正在尝试配置 kestrel,以便当它处于原始模式时在特定端口上运行。但是这样做似乎 launchsettings.json 需要传递命令行参数才能这样做,因为没有直接选项并且它总是在端口 5000
我是一名优秀的程序员,十分优秀!