You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复C#代码中‘名称“i”在当前上下文中不存在’的错误?

如何修复C#代码中‘名称“i”在当前上下文中不存在’的错误?

嗨,我来帮你理清这个问题并搞定它~

首先,咱们先看报错的根本原因:你在for循环的括号里声明的int i,它的作用域只局限在for循环的大括号内部。如果你的循环跑完了9次都没找到空位置(也就是从来没触发过break),那当你在循环外面写return i的时候,这个i已经“消失”了——编译器根本找不到它,所以就会抛出这个错误。

而且哦,你原来的代码还有个隐藏的逻辑问题:你在循环体里重新给i赋值Random.Range(0,8),这会彻底打乱for循环原本的计数逻辑。比如第一次循环i=0,你把它改成随机数,下次循环i会变成这个随机数+1?这会导致你可能重复检查同一个位置,或者漏掉某些位置,极端情况下甚至可能陷入无限循环。

下面给你两种靠谱的修复方案,你可以根据需求选:


方案一:优化随机查找逻辑(适合小范围的棋盘)

把变量i的声明移到循环外面,同时改用while循环来做随机查找,还加上最大尝试次数防止死循环:

int getRandPos()
{
    // 把变量声明移到循环外,确保return时能访问到
    int targetPos = 0;
    bool foundEmptySpot = false;
    // 设置最大尝试次数,避免所有位置都满了的时候无限循环
    int maxTries = 100;
    int tries = 0;

    while (!foundEmptySpot && tries < maxTries)
    {
        // 注意Random.Range是左闭右开,写9才能取到0-8的索引
        targetPos = Random.Range(0, 9);
        if (player[targetPos] == Seed.EMPTY)
        {
            foundEmptySpot = true;
        }
        tries++;
    }

    // 处理所有位置都被占满的情况,返回-1作为标记(你也可以改成抛出异常)
    if (!foundEmptySpot)
    {
        return -1;
    }

    return targetPos;
}

方案二:先收集所有空位置再随机选择(更高效可靠)

这种方式会先遍历一遍棋盘,把所有空位置的索引存起来,再从里面随机选一个。逻辑更清晰,也不会做无效的重复查找:

int getRandPos()
{
    List<int> emptyPositions = new List<int>();
    // 遍历整个player数组,收集所有空位置的索引
    for (int i = 0; i < player.Length; i++)
    {
        if (player[i] == Seed.EMPTY)
        {
            emptyPositions.Add(i);
        }
    }

    // 如果没有空位置,返回-1标记
    if (emptyPositions.Count == 0)
    {
        return -1;
    }

    // 从空位置列表里随机选一个
    int randomIndex = Random.Range(0, emptyPositions.Count);
    return emptyPositions[randomIndex];
}

最后再划个重点:

  1. 原报错的核心是变量作用域——循环内部声明的变量,外部代码访问不到;
  2. 不要随便修改for循环的计数器变量,这会让循环逻辑变得混乱;
  3. 推荐用方案二,尤其是当棋盘变大的时候,效率会比随机试错高很多。

备注:内容来源于stack exchange,提问作者Sophie Lee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.17 07:35:30