C# 不是所有的代码路径都返回值,尽管我确实有返回值?

C# 不是所有的代码路径都返回值,尽管我确实有返回值?,c#,C#,我试图根据输入返回一些字段,如手机、主地址、cityStateZip、服务器设置,我已经实现了一个有趣的switch语句,但很明显,我在所有情况下都返回字符串 public static string JsonToObjects(bool Enumerate, string jsonInputFile) { string inputFile = Path.GetFileName(jsonInputFile); // Return File Name + Extension var

我试图根据输入返回一些字段,如手机、主地址、cityStateZip、服务器设置,我已经实现了一个有趣的switch语句,但很明显,我在所有情况下都返回字符串

public static string JsonToObjects(bool Enumerate, string jsonInputFile)
{
    string inputFile = Path.GetFileName(jsonInputFile); // Return File Name + Extension
    var lines = GetLines(File.ReadAllText(jsonInputFile));
    var groups = lines.GroupByProximity(0.12);
    var lookup = groups.ToLookup(g => g.First().Text, g => g.Skip(1).Select(line => line.Text));
    var serverSetup = lookup["Server Setup"]
        .First().SkipWhile(s => s.ToString().ToUpper() != "V").Skip(1).FirstOrDefault();

    switch (Enumerate)
    {
        case true:
            Log("\nEnumerating JSON items...\n");
            
            var cellPhone = lookup["Cell Phone"].First().FirstOrDefault();
            var mainAddress = lookup["Main Address"].First().FirstOrDefault();
            var cityStateZip = lookup["City / State / Zip"].First().FirstOrDefault();

            Log(cellPhone);
            Log(mainAddress);
            Log(cityStateZip);
            Log(serverSetup);

            Log("\n");

            var pairs = lines.SkipWhile(l => l.Text != "Practice Name").Pairs();

            // Ingest the lines in pairs and setup the values to go out into the CSV.
            foreach (var pair in pairs)
            {
                Log($"{pair.Key}: {pair.Value}");
                return $"{pair.Key}: {pair.Value}";
            }

            break;
        case false:
            Log("Using Cho Package...");

            using (var p = new ChoJSONReader(jsonInputFile).WithJSONPath("$..readResults")) // "readResults": [
            {
                p.Where(r1 => r1.page == 1)
                .Select(r1 =>
                {
                    var lines = (dynamic[])r1.lines;
                    return new
                    {
                        FileName = inputFile,
                        Page = r1.page,
                        CellPhone = //lines[12].text,
                            fieldValue(lines, "Cell Phone"),
                        //cellPhone,
                        MainAddress = //lines[16].text,
                            fieldValue(lines, "Main Address"),
                        //mainAddress,
                        CityStateZip = //lines[18].text,
                            fieldValue(lines, "City / State / Zip"),
                        //cityStateZip,
                        ServerSetup = serverSetup
                    };
                }
                );
            }
            break;
        default:
            Log("Default case");
            return "Default case";
            break;
    }
}
那么为什么我仍然会出错呢

并非所有代码路径都返回值

如果要根据应用的是true还是false大小写更改返回的内容,请更改开关中的每个中断,使其成为返回,或者在完成开关后,在方法末尾放置一个返回语句

编译器不是在开玩笑;它确实可以看到代码中不以返回结尾的路径。你也可以追踪他们。。按照你的真实情况行事。。它可以到达break,退出开关,然后在到达方法末尾之前没有返回语句。您可以肯定,pairs肯定总是有值的,但编译器对程序的了解程度与您不同,而且它不会回溯到试图找到pairs总是有值的证据。。它只是在一个循环中看到返回语句,这个循环是一个可能不会执行的块,这意味着代码可能不会命中该返回语句

如果你对默认值有错觉,在一个开关中。。在没有其他情况适用时使用。它不是每次都运行的东西,不管是否应用了其他案例,所以如果其他案例没有应用它,它不能作为一个包罗万象的东西来返回


如果您确定开关中的一个返回将被命中,那么您可以在方法结束时返回一些无用的或更好的结果,抛出一个带有有意义消息的异常,这样在6个月内,当所有这些开关语句都没有返回JSONTOBJECTS中的值时,输入值。。。开始出现在日志中,你有一个很好的指针,指出哪里出了问题,哪里出了问题。不要发出错误消息,这永远不会被击中

想象成对是空的,并且foreach的主体永远不会被执行。此外,您没有在您的情况下返回假。回答的问题?在您的情况下,返回值不是false语句,而是在您的语句中的lambda函数中。选择“否”,则不会返回。我建议你阅读c语言语法的基础知识,在你的错误案例中没有返回语句。就这么简单。你需要在字符串中断之前返回它。你需要更多地考虑当事情不顺利时你想做什么。在false的情况下,如果p中没有page==1怎么办?返回将永远不会运行。然后呢?如果那样的话,你应该退还什么?事实上,如果没有配对呢?如果没有配对,返回什么是合理的?在这一部分中,一次返回就足够了。但是你没有。是的,在p.Wherer1=>r1.page==1.Selectr1=>{var lines=dynamic[]r1.lines;返回new,但这不是从方法返回的。这是从Select only返回的。这是抛开您没有对Where执行任何操作的事实,所以您还是可以删除所有代码。后退一步,解释一下您希望函数执行的操作。嗯,当我将break改为re时turn i Get Control无法从一个案例标签case:false切换到另一个案例标签case:false。另外,在case:false中,我尝试返回一个字段,如return CityStateZip,但它抱怨CityStateZip名称在当前上下文中不存在。我尝试在using内部和using外部返回它,但没有任何效果。Tha听起来好像您删除了一个中断,但没有提供返回,这意味着编译器现在可以看到代码到达下一个案例开头的路径,这在c中是不允许的。第二个问题是,听起来好像您试图在其存在的范围之外返回CityStateValue。它只存在于选择。你不能只是将一个变量从3个级别的括号嵌套中拖出3个作用域并粘贴进去。回到你在Q中的形式,在方法的末尾抛出一个异常。当代码出错时,找出为什么你可以在方法的末尾返回一些无用的东西。它解决了案例中的错误:false section wh恩,我返回了一些像return无用的东西。很好,现在我需要返回实际的字段。我尝试在选择范围内返回,但在它之外,没有一个有效,一直抱怨它在当前上下文中不存在。我想,我如何返回像这样的lambda字段?我的意思是我可以诚实地摆脱第二个因为第一个工作很好,今天到此为止,但我仍然很好奇这个案例:出于学习目的的错误工作。当代码显示Selectreturn new…,这不是你的代码所做的吗?你可以有任意多的返回。你不必将返回移出 选择怪异,因为它是做一个选择返回,您只需添加另一个。这意味着编译器会很高兴,不管发生什么,它都能返回