C# 并非所有路径都返回值

C# 并非所有路径都返回值,c#,syntax-error,C#,Syntax Error,所以我的谷歌语音API在我的程序中出现了一个错误。正如标题所示,错误是“并非所有路径都返回值”。 这是代码(2个)(相同错误) 第二件: public class Hypothesis { public string utterance; public double confidence = -1.0d;//-1 = No Value public override string To

所以我的谷歌语音API在我的程序中出现了一个错误。正如标题所示,错误是“并非所有路径都返回值”。 这是代码(2个)(相同错误)

第二件:

            public class Hypothesis
        {
            public string utterance;
            public double confidence = -1.0d;//-1 = No Value
            public override string ToString()
            {
                return "'" +utterance + "'" + ((confidence == -1) ? "" : "@" + confidence);
            }
            public List<Hypothesis> hypotheses = new List<Hypothesis>();

            public Hypothesis getBestHypothesis()
            {
                if (hypotheses.Count() <=0)
                    return null;
                Hypothesis H = hypotheses[0];
                foreach (Hypothesis h in hypotheses)
                {
                    if (h.confidence>=H.confidence)
                    {
                        H = h;
                    }
                    return H;
                }
            }
公共阶级假说
{
公共字符串发音;
公众双重信心=-1.0d;/-1=无值
公共重写字符串ToString()
{
返回“'”+话语+“+”+((置信度==-1)?:“@”+置信度);
}
公共列表假设=新列表();
公共假说
{
if(假设数()=H.置信度)
{
H=H;
}
返回H;
}
}
这两个代码都有相同的错误,只有当我指定某个变量名与另一个变量名(确切地说是FlacFileName)相同时,才会出现这种情况。如果你们能告诉我为什么会发生这种事,那太棒了,谢谢

您的方法签名

public static SpeechInputResult ProcessFlacFile(string FlacFileName, int BIT_RATE = DEFAULT_BIT_RATE, string language = DEFAULT_LANGUAGE, uint maxresults = 1)
声明您将返回一个
SpeechInputResult
,但您没有
return
语句

您应该将签名更改为
void
,或者实际返回一个值


在第二个实例中,在for循环之后需要一个return语句。

第一段代码没有任何return语句。在第二个代码块中,在for循环外放置一个伪return语句。

在第一个方法中,您在签名中声明,它将返回类型为
SpeechInputResult
的实例,而您不从主体返回它


在第二种方法中,您是从
foreach
循环内部返回的,但是如果您的
假设
列表中没有任何元素呢?您还应该从
foreach
循环外部返回默认值,或者如果异常不是您期望的行为,则应该抛出异常。

ProcessFlacFile
上述代码中的方法在所有情况下都应返回类型
SpeechInputResult
对象

您可以在try-and-catch-as之后返回对象

try
{
}
catch
{
}

return SpeechInputResultObj

try
catch
语句中返回
SpeechInputResult
对象

try
{
    ....
    return SpeechInputResultObj;
}

catch
{
    ....
    return SpeechInputResultObj;
}

像前面提到的每个人一样,在第一个方法的末尾添加一个
return
语句。只返回一个
null或任何适合您的情况。实际上,在该方法中根本没有其他
return
语句,因此不像第二种情况那样“并非所有路径都返回值”。。。您可能只想将签名从
SpeechInputResult
更改为
void


在第二种方法中,似乎您已经涵盖了您的基础,因为:

  • 如果
    假设
    为空且
  • 如果
    假设不为空,则返回的
    假设的“置信度”最大
但是编译器不够聪明,无法看到这一点。尝试移动
返回null结束。只有当列表中没有元素且
foreach
循环未运行时,才能使其存在

public Hypothesis getBestHypothesis()
{
    if (hypotheses.Any())
    {
        Hypothesis H = hypotheses[0];

        foreach (Hypothesis h in hypotheses)
        {
            if (h.confidence >= H.confidence)
            {
                H = h;
            }
            return H;
        }
    }
    return null;
}

此外,整个第二种方法可以减少(借助LINQ):


我发现在你的代码中你必须返回
SpeechInputResult
,但是没有使用return语句的地方。 最好在代码中使用
returnspeechinputresult

另一方面,如果您不愿意返回任何内容,请将您的函数如下所示

public static void ProcessFlacFile(string FlacFileName, int BIT_RATE = DEFAULT_BIT_RATE, string language = DEFAULT_LANGUAGE, uint maxresults = 1)
如果希望在这种情况下不出现错误,可以使用void代替上述代码中的类
SpeechInputResult

在第二段代码中,您只实例化了代码。ie声明并直接使用它 必须为创建的对象指定某些内容,以便可以在foreach中执行操作

在这种情况下,假设里面没有任何东西

此外,您还在foreach循环中编写了return语句,其中作为焦点的语句永远不会进入foreach循环


首先,你将某件事分配给假设,使其具有价值,然后执行行动。

好,这意味着代码中的所有执行路径都不会返回值。在第一个函数中没有
return
语句。因此,在第一个if语句的末尾添加一个return语句?我只需要将return设置为null;在接球和比赛结束时,它成功了!
return hypotheses.OrderByDescending(x => x.confidence).FirstOrDefault();
public static void ProcessFlacFile(string FlacFileName, int BIT_RATE = DEFAULT_BIT_RATE, string language = DEFAULT_LANGUAGE, uint maxresults = 1)