检测到无法访问的代码问题(但我需要在某处返回)

时间:2015-12-16 09:14:53

标签: c# unreachable-code

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

我知道这意味着for循环无法完成其余的迭代。那么我在哪里产生/返回?

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");
}

2 个答案:

答案 0 :(得分:2)

yield return不会阻止循环运行,它只是(本质上)暂停它,并返回当前值。一旦你恢复,你仍然处于循环中,并且由于它是一个while(true)循环,你会留在那里,所以声明i++在理论上确实无法到达。此外,如果数组中包含任何元素,您将永远不会访问print("Word Typing Ended");

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

除此之外,yield应该用于简化返回复杂的对象集合,其中获取元素可能包含一些开销,或者元素依赖于先前的状态,但是它本身应该是相对无副作用。我非常确定使用yield return null处理现有数组是对该功能的误用。

尝试解释你真正想要做的事情,可能有一个不需要屈服的解决方案。

答案 1 :(得分:2)

  

当按下右键时,我需要while循环停止并返回到for循环并重新开始。

所以... continue;

  

但是当我返回时,它会退出两个循环并且我检测到无法访问的代码。

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

您看到&#34;检测到无法访问的代码的原因&#34;是因为{{1>} 永不退出,所以它知道永远不会达到while(true)。如果您在i++内添加break;:它将正常运行。您还可以添加while (true)以退出整个枚举器,但仍然意味着永远不会达到yield break;,并且会标记为无法访问。