繁体   English   中英

如何修复错误 CS0161; 不是所有的代码路径都返回一个值 c# 吗?

[英]How to fix Error CS0161; not all code path return a value c#?

我是 c# 的新手,目前正在开发一个读取文本文件路径然后显示该文件中最长单词的程序。 这是我的代码:

        static void Main(string[] args)
        {
            Console.WriteLine("Enter the path for a text file: ");
            var path = Console.ReadLine();
            Console.WriteLine(LongestWord(path));
        }

        public static string LongestWord(string path) 
        {
            var characters = new char[] { ' ', '.', ',', ';', '?', '\n', '\r' };
            var content = File.ReadAllText(path);
            var words = content.Split(characters);
            var list = new List<int>();
            if (File.Exists(path))
            {
                foreach (var word in words)
                {
                    list.Add(word.Length);
                }
                int max = list.Max();
                for (int i = 0; i < words.Length; i++)
                {
                    var count = words[i].ToCharArray();
                    if (count.Count() == max)
                    {
                        return words[i];
                    }
                }
            }
            else
            {
                return "You entered a file that could not be located";
            }

        }

如您所见,我尝试使“Longestword”成为一种我可以在任何地方使用的方法。 这是我得到命名错误的时候。 如果我在同一个 Main class 中使用代码,则代码会以其他方式工作。

我尝试了几个“if”语句和异常,但似乎都没有解决问题。

这里的问题是有一个执行路径没有遇到 return 语句。 特别是在文件计数和打开的位置,但是第二个 for 循环中的 if 语句永远不会被评估为 true。

现在在正常执行下,这应该永远不会发生,但这在技术上是可行的。 解决此问题的一种方法是在此循环后抛出异常。 但最好的办法是解决逻辑。

如果您愿意使用 LINQ,则:

            foreach (var word in words)
            {
                list.Add(word.Length);
            }
            int max = list.Max();
            for (int i = 0; i < words.Length; i++)
            {
                var count = words[i].ToCharArray();
                if (count.Count() == max)
                {
                    return words[i];
                }
            }

可以替换为: return words.OrderByDescending(w => w.Length).First();

否则应返回默认值,例如null或列表的最后一个元素。

其他一些注意事项:使用字符串或数组时,可以使用.Length属性代替 Linq Extension .Count() .Length只是检索存储的值(快速),但.Count()每次都会循环遍历字符串/数组(尽管 Linq 已进行优化以避免此类额外工作)

if (count.Count() == max)之后没有返回语句。 您还应检查文件是否不为空。 如果文件不存在,最好抛出异常。 您在检查文件是否存在之前尝试读取文件,如果文件不存在,您将获得异常。

static string? LongestWord(string path) {
    var characters = new char[] { ' ', '.', ',', ';', '?', '\n', '\r' };
    var list = new List<int>();
    string result = string.Empty;
    if (File.Exists(path)) {
        var content = File.ReadAllText(path);
        if(content.Length > 0) {
            var words = content.Split(characters);
            foreach (var word in words) {
                list.Add(word.Length);
            }
            int max = list.Max();
            for (int i = 0; i < words.Length; i++) {
                var count = words[i].ToCharArray();
                if (count.Count() == max) {
                    result = words[i];
                }
            }
            return result;
        } else {
            return null; //Or throw exception
        }
    } else {
        throw new FileNotFoundException();
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM