检测到无法访问的代码(为什么?)

Unreachable Code Detected (Why?)

那么,为什么在这段代码中检测到无法访问的代码:

      public bool GetKeyPressed(KeyCode key)
    {
        for (int i = 0; i < keys.Count; i++)
            if (keys[i].key == key && keys[i].pressed)
                return true;
            else
                return false;

        return false;
    }

索引 (i) 显然无法访问...为什么?

您的代码有两个代码路径,一个是通过 if 条件,另一个是通过 else。这意味着控件将以这两种方式离开功能。所以 else 之后的 return 语句永远不会触发。这就是编译器将其指向无法访问的代码的原因。这可以通过使用以下代码来避免。

public bool GetKeyPressed(KeyCode key)
{
    for (int i = 0; i < keys.Count; i++)
        if (keys[i].key == key && keys[i].pressed)
            return true;          
        return false;
}

您的代码有一个计算一次的循环,因此第一次迭代将总是 return。

如果那是你想要的,就说吧,

return keys[0].key == key && keys[0].pressed;

但是如果(这是我在这里怀疑的),如果数组中的 any 满足您的测试,您希望 return 为真,然后使用 LINQ 的 Any(),

return keys.Any(k => k.key == key && k.pressed);

扩展 jdphenix 答案,我认为我们需要了解 为什么 你的循环“ 评估一次" 才明白为什么会有"unreachable code".

public bool GetKeyPressed(Keys key)
{
    for (int i = 0; i < keys.Count; i++)
        if (keys[i].key == key && keys[i].pressed)
            return true;
        else
            return false;

    return false;
}

for 循环有一个 if-else 语句构成循环体。 if 守卫如果满足 returns true 否则它会执行下一个 else 语句 returns false。最终结果是,无论 keys.

中的项数如何,在控制权返回调用方法之前最多执行一个循环周期。

如果我们通过 JetBrains 查看代码会更明显 Resharper:

代码不妨写成:

public bool GetKeyPressed(Keys key)
{
    for (int i = 0; i < keys.Count; ) // Look Ma, no i++  !!!
        if (keys[i].key == key && keys[i].pressed)
            return true;
        else
            return false;

    return false;
}

不要错误地认为方法末尾的最后一个 return false 是不需要的,因为它是在 keys.Count == 0

的场景中

当然,将代码格式化得更漂亮一点有助于揭示第一个 return false 是多余的并且可以按照 :

进行简化的问题