C#函数在Unity中返回字符串错误,并非所有代码路径都返回值

C#函数在Unity中返回字符串错误,并非所有代码路径都返回值

我认为我的 for 循环有问题?


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using BreakInfinity;
using System.Numerics;

public class Notation : MonoBehaviour
{
    public int[] length;
    public string[] letter;

    void Start()
    {
        length = new int[11] { 7,10,13,16,19,21,24,27,30,33,36};
        letter = new string[11] { "K", "M", "B", "T", "q", "Q", "s", "S", "O", "N", "D" };
    }

    public BigDouble Divide(BigDouble num, int power)
    {
        return num / Math.Pow(10, power);
    }

    public string Notate(BigDouble num)
    {
        int digits = num.ToString().Length;

        if (num >= 10000)
        {
            if (digits > 36)
            {
                return "infinite";
            }
            else
            {
                for (int i = 0; i < 11; i++)
                {
                    return Divide(num, digits - 2).ToString("F2") + letter[i];
                }
            }
        }
        else
        {
            return num.ToString();
        }
    }
}

答案1

由于您没有具体说明显示了什么错误以及在哪里,我只能猜测这里的问题。但我仍会尽力提供帮助,虽然已经很晚了,但这可能会帮助将来遇到类似问题的人。

我认为编译器会抱怨“并非所有代码路径都会返回值” Notate。原因是该方法中通过这些 if/else 的每个路径都需要以语句结尾return,而内部部分缺少该语句else。更准确地说,在for循环中。尽管它确实包含一个return语句,但该语句“不算数”以满足else以 return 语句结尾的条件。原因是循环for还会执行条件语句才能运行,因此理论上也可以根据其条件语句跳过它。“显然”这里的情况并非如此,因为只迭代了一个整数,但对于编译器来说,这并不是“那么明显”。因此,要解决这个问题,您需要以else始终会被命中的 in return 语句结尾 - 因此在循环之外for

此外,for循环实际上毫无用处,因为它会在第一次迭代时返回,从而使所有其他迭代都变得毫无用处。此外,如果的内容letter不变,那么您将始终得到相同的字符串 - 因此无需每次都创建它。虽然我们正在改进代码,但我强烈建议避免使用嵌套的 if/else,因为它们很容易变得不可读,因此很难理解。如果它们return通过反转逻辑并立即返回而最终形成语句,则很容易“解开”它们。

这是我的建议(虽然我不确定你想用我替换的for循环实现什么):letterstring.Join

public string Notate(BigDouble num)
{
    if (num < 10000)
        return num.ToString();

    int digits = num.ToString().Length;

    if (digits > 36)
        return "infinite";

    return Divide(num, digits - 2).ToString("F2") + string.Join("", letter);
}

相关内容