【问题标题】:How can i solve No such label 'resetupdate' within the scope of the goto statement error?在 goto 语句错误的范围内如何解决 No such label 'resetupdate'?
【发布时间】:2023-03-12 03:43:02
【问题描述】:

我必须在 c# 中使用这段代码:

while(true){
    resetupdate:
    //somecode here
}
goto resetupdate;

但是在goto resetupdate; 行我得到这个错误:

在 goto 语句的范围内没有这样的标签 'resetupdate'

我该如何解决这个问题?或者怎么打电话给resetupdate?

【问题讨论】:

  • 你不能跳入进入控制流语句的主体。
  • @Damien_The_Unbeliever 我可以用其他方式来达到这个目的吗?
  • 我们需要看到一个更完整的例子来说明你正在尝试做什么。我猜在while 结束后至少有一些代码 并且goto 不是无条件的,正如您在此处展示的那样。向我们展示问题,而不是您尝试删除所有上下文的解决方案。
  • 虽然goto 有其使用范围,但它们非常小而且很少见。学习在没有 goto 的情况下解决程序流问题。
  • @atlaste - 是的,但随后他们立即尝试跳回进入循环以使其更加无限?我想他们可能找到了break,但没有找到continue,但正如我所说,我们确实需要更多上下文。

标签: c# goto


【解决方案1】:

您的范围带有“{”并以“}”标记结尾。因为您的标签在子范围内,所以您无法访问它。

显然,您可以使用更多丑陋的 goto 来解决此问题:

// YUCK YUCK YUCK!

start:
// some code
resetupdate:
//somecode here
// ... break becomes:
if (someCondition) { goto exitloop; }
//
goto start;
exitloop:
// your condition code...
goto resetupdate;

不知道为什么你会想要这样的东西....这些类型的 goto 结构编译得很好,但对于其他软件开发人员来说完全不可读。


好的,让我们先看一下最初的问题:

while(true){
    // **1
    resetupdate:
    //somecode here **2
}
goto resetupdate;

现在,我在这里猜测somecode (**2) 会以某种方式发出break,否则整个标签/goto 构造没有任何意义。因此,回到循环中只需移动 resetupdate:

resetupdate:
while(true){
    //somecode here that uses break
}
goto resetupdate;

但是,这并不能解决当 **1 也包含代码时会出现的问题。为此,您可以更改代码以使用更多 goto 和标签...

首先避免这些类型的结构要好得多 - 但如果没有更多上下文信息,我无法做到这一点。

【讨论】:

  • 这不是一个修复,因为它永远不会通过第一个 goto
  • @LeMoN.xaH 它会像原始问题中的while(true) 一样顺利通过。
  • @LeMoN.xaH 很好,我在答案中添加了更多信息。它会很好用,只是丑得要命。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-07
  • 2018-05-19
  • 1970-01-01
  • 2020-02-14
  • 1970-01-01
相关资源
最近更新 更多