gpt4 book ai didi

c# - 为什么 C# 编译器不能告诉这个函数总是返回或抛出?

转载 作者:太空宇宙 更新时间:2023-11-03 17:08:10 25 4
gpt4 key购买 nike

我有以下(简化的)方法:

public bool DoWorkWithRetry()
{
for (int remainingTries = Constants.MaxRetries; remainingTries >= 0; remainingTries--)
{
try
{
return DoWork();
}
catch (Exception ex)
{
if (remainingTries == 0)
{
throw new WorkException(
String.Format("Failed after {0} retries.", Constants.MaxRetries),
ex);
}
// fall through to retry
}
}
}

我很清楚这个方法要么返回要么抛出。但是,C# 编译器向我提示 并非所有代码路径都返回一个值

  • 这是 C# 编译器代码分析的局限性吗?
  • 或者是否存在某些情况,我没有看到 for 循环可以在不抛出或返回的情况下完成?

最佳答案

编译器只是遵循语言规范。

该语言不会尝试分析“如果你从一个整数开始并反复减一,你总是会在某个时候达到零”。这甚至假设 Constants.MaxRetries 是编译时常量。

基本上,语言规范有可达性的规则 - 如果其中一个为真,则for语句的终点是可达的(C# 4 规范的第 8.8.3 节):

  • for 语句包含可到达的 break 语句,该语句退出 for 语句
  • for 语句是可到达的,for-condition 存在并且不具有常量值true

后一点是这里的情况,所以 for 语句的末尾是可达的。不允许到达非 void 方法的末尾,因此会出现错误。 (C# 规范的第 8.1 节。)

另一种方法是让语言非常、非常变得更加复杂。我完全同意这个不编译。

关于c# - 为什么 C# 编译器不能告诉这个函数总是返回或抛出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13292703/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com