方法返回错误“并非所有代码路径都返回值,请协助

时间:2019-10-21 08:54:36

标签: c# unity3d

使用unity创建一个过程映射,我收到错误消息“ Cs0161:并非所有代码路径都返回一个值”,我对编码还是很陌生,可能犯了一些错误。

我已经尝试过Google,但是答案对我来说甚至都没有意义

MapData GenerateMapData()
{
    float[,] noiseMap = Noise.GenerateNoiseMap(mapChunkSize, mapChunkSize, seed, noiseScale, octaves, lacunarity, persistance, offset);

    Color[] colourMap = new Color[mapChunkSize * mapChunkSize];

    for (int y = 0; y < mapChunkSize; y++)
    {
        for (int x = 0; x < mapChunkSize; x++)
        {
            float currentHeight = noiseMap[x, y];
            for (int i = 0; i < regions.Length; i++)
            {
                if (currentHeight <= regions[i].height)
                {
                    colourMap[y * mapChunkSize + x] = regions[i].colour;
                    break;
                }
            }
        }

        return new MapData(noiseMap, colourMap);
    }
}
  

错误CS0161'MapGenerator.GenerateMapData()':并非所有代码路径都返回值Assembly-CSharp

3 个答案:

答案 0 :(得分:1)

在for循环之后,您还应该返回一个值。请参见下面的代码和方法底部的注释:

MapData GenerateMapData()
{
    float[,] noiseMap = Noise.GenerateNoiseMap(mapChunkSize, mapChunkSize, seed, noiseScale, octaves, lacunarity, persistance, offset);

    Color[] colourMap = new Color[mapChunkSize * mapChunkSize];

    for (int y = 0; y < mapChunkSize; y++)
    {
        for (int x = 0; x < mapChunkSize; x++)
        {
            float currentHeight = noiseMap[x, y];
            for (int i = 0; i < regions.Length; i++)
            {
                if (currentHeight <= regions[i].height)
                {
                    colourMap[y * mapChunkSize + x] = regions[i].colour;
                    break;
                }
            }
        }

        return new MapData(noiseMap, colourMap);
    }

    // You should also return something here
}

从理论上讲,mapChunkSize的值可以为0(零),并且根本不会进入第一个for循环。这就是为什么在底部也需要return语句的原因。

答案 1 :(得分:0)

之所以收到该错误,是因为return语句位于for循环内。更具体地说,可能不会执行任何循环(例如mapChunkSize ==0。然后0不小于0,并且程序不会进入for循环),因此没有任何返回。因此,要么将返回值移到循环之外,要么在循环外添加另一个返回。

MapData GenerateMapData()
    {
        float[,] noiseMap = Noise.GenerateNoiseMap(mapChunkSize, mapChunkSize, seed, noiseScale, octaves, lacunarity, persistance, offset);

        Color[] colourMap = new Color[mapChunkSize * mapChunkSize];

        for (int y = 0; y < mapChunkSize; y++)
        {
            for (int x = 0; x < mapChunkSize; x++)
            {
                float currentHeight = noiseMap[x, y];
                for (int i = 0; i < regions.Length; i++)
                {
                    if (currentHeight <= regions[i].height)
                    {
                        colourMap[y * mapChunkSize + x] = regions[i].colour;
                        break;
                    }
                }
            }

            /*return new MapData(noiseMap, colourMap); //uncommenting this might still leave you with the functionality you want */
        }

        return new MapData(noiseMap, colourMap);

}

答案 2 :(得分:0)

您不会在第一个循环外返回任何东西,请尝试在循环内求值,然后从循环外返回。

for (int y = 0; y < mapChunkSize; y++)
        {
            for (int x = 0; x < mapChunkSize; x++)
            {
                float currentHeight = noiseMap[x, y];
                for (int i = 0; i < regions.Length; i++)
                {
                    if (currentHeight <= regions[i].height)
                    {
                        colourMap[y * mapChunkSize + x] = regions[i].colour;
                        break;
                    }
                }
            }

            return new MapData(noiseMap, colourMap);
        }

       add return statement here