关于C#:检测到无法访问的代码的问题(但我需要在某个地方返回)

Issue with Unreachable Code Detected (but I need to yield return somewhere)

问题如下。我正在做一个打字游戏的变体,我的问题是我需要循环我的char数组并检查用户是否按了正确的键(引入了等待用户输入的要求)。当按下正确的键时,我需要while循环停止并返回for循环并重新开始。但当我返回时,它会同时退出两个循环,并检测到无法访问的代码。

我知道这意味着for循环不能通过它的其余迭代。那么,我在哪里屈服/回报呢?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
IEnumerator TestMyCoroutine() {

    for (int i = 0; i < gCharArray.Length; i++) {
        string charHolder = gCharArray[i].ToString();

        while (true) {

            if (Input.anyKeyDown) {

                if (Input.GetKeyDown(charHolder)) {

                } else {

                    print("Wrong Letter");

                }
                print(charHolder);

            }

            yield return null;
        }
    }
    print("Word Typing Ended");
}


When the right key is pressed, I need the while loop to stop and go back to the for loop and start over.

所以…EDOCX1?9?

But when I yield return, it exits both loops and I get Unreachable Code Detected.

不,yield return不退出任何循环。执行将恢复到原来的位置。

您看到"检测到无法访问的代码"的原因是因为while(true)永远不会退出,所以它知道i++永远不会到达。如果在while (true)中添加一个break;:它将正常工作。您也可以添加一个yield break;以退出整个枚举器,但这仍然意味着无法到达i++,并将标记为不可访问。


yield return不会停止循环运行,它只是(本质上)暂停循环,并返回当前值。一旦你重新开始,你仍然在循环中,因为它是一个while(true)循环,你将留在那里,所以从理论上说,i++语句确实是不可访问的。而且,如果数组中有任何元素,就永远无法访问print("Word Typing Ended");

您可以使用传统的break语句退出while循环,或者如果您基本上想结束枚举器的执行,也可以使用yield break

除此之外,应该使用yield来简化返回一个复杂的对象集合的过程,其中获取元素可能包含一些开销,或者元素依赖于以前的状态,但这本身应该是相对没有副作用的。我敢肯定,使用yield return null处理现有阵列是对该功能的滥用。

试着解释一下你到底想要做什么,可能有一个不需要屈服的解决方案。