gpt4 book ai didi

c# - 并非所有代码路径都返回,但编译器将其视为所有路径都返回

转载 作者:太空狗 更新时间:2023-10-29 23:55:11 27 4
gpt4 key购买 nike

我想不出一个好的标题,但我的问题并不像看起来那么幼稚。

考虑一下:

public static void ExitApp(string message)
{
// Do stuff
throw new Exception(...);
}

public static void ExitApp(string message)
{
// Do stuff
System.Environment.Exit(-1);
}

这些方法都不会返回。但是当你在别处调用这些方法时:

public int DoStuff()
{
// Do stuff
if (foo == 0)
{
throw new Exception(...);
}
else if (foo == 1)
{
// Do other stuff
return ...;
}
else
{
ExitApp("Something borked");
}
}

尝试对其进行编译,您将在 DoStuff 中得到“并非所有代码路径都返回一个值”。仅仅为了让编译器满意而使用异常跟踪对 ExitApp 的调用似乎很愚蠢,即使我知道这很好。似乎在 ExitApp() 中我无法做任何事情来表明它永远不会返回。

我如何向编译器指示 ExitApp 永远不会返回,因此 DoStuff 的 else block 也永远不会返回? 这似乎是一个相当简单的错误,它的路径检查无法解决。

即使我只使用第一个 ExitApp(抛出异常)并且该方法返回一个 int,路径检查器也足够聪明,可以意识到它永远不会返回,因此它不会提示 int 类型。这个编译文件:

public static int ExitApp(string message)
{
// Do stuff
throw new Exception(...);
}

但是,鉴于它知道这个 ExitApp 永远不会返回一个 int,它不会将其外推到 DoStuff() 所以我倾向于相信我的问题没有解决方案。我唯一的选择是在调用 ExitApp 后抛出异常。

public int DoStuff()
{
...
else
{
ExitApp("Something borked");
throw new NotImplementedException("Should not reach this");
}
}

编译器的这种行为是否有原因?

最佳答案

我为此定义了一个异常:UnreachableException。这似乎是多余的,但这是一种简单的方式来表达“嘿,阅读本文的人,永远不应该执行这一行!”。我通常将它用于某些 switch 语句的默认情况,但它也适用于此。

只需在 ExitApp 行后添加一个即可。

public void int DoStuff()
{
// Do stuff
if (foo == 0)
{
throw new Exception(...);
}
else if (foo == 1)
{
// Do other stuff
return ...;
}
else
{
ExitApp("Something borked");
throw new UnreachableException();
}
}

该语言不支持声明一个总是抛出异常的方法的真正原因只是:不值得。语言开发人员没有无限的时间来应用我们能想到的每一个特性。他们必须确定优先顺序。

我敢打赌这是您第一次遇到这种情况,看看:显式抛出异常可以解决这个问题。他们为什么要费心去处理这样一个罕见的、容易绕过的案例?他们可能会花时间实现可选参数、动态参数或其他一些比说函数总是抛出异常更有用和更频繁使用的东西。

这并不是说它永远不会实现。这种类型的方法信息正是合约擅长指定的事物类型。所以也许它会包含在代码契约(Contract)中。

关于c# - 并非所有代码路径都返回,但编译器将其视为所有路径都返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/836276/

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