C# 错误:并非所有代码路径都返回值

C# 错误:并非所有代码路径都返回值,c#,C#,为什么会这样?这是我从bin文件读取字典的代码 public static object LoadObject() { try { if (File.Exists("D://my.bin")) { FileStream stream = File.OpenRead("D://my.bin"); BinaryFormatter formatter = new BinaryFormatter();

为什么会这样?这是我从bin文件读取字典的代码

public static object LoadObject()
{
    try
    {
        if (File.Exists("D://my.bin"))
        {
            FileStream stream = File.OpenRead("D://my.bin");
            BinaryFormatter formatter = new BinaryFormatter();

            Dictionary<int, Question> deserializedObject = (Dictionary<int, Question>)formatter.Deserialize(stream);
            stream.Close();
            return deserializedObject;
        }
    }
    catch
    {

    }
}

如果代码引发异常或不满足条件文件.Exists,也需要返回 然而,照目前的情况,捕捉异常是没有意义的。如果你什么都不做,就让它在上层冒泡

public static object LoadObject()
{
    if (File.Exists("D://my.bin"))
    {
        FileStream stream = File.OpenRead("D://my.bin");
        BinaryFormatter formatter = new BinaryFormatter();

        Dictionary<int, Question> deserializedObject = (Dictionary<int, Question>)formatter.Deserialize(stream);
        stream.Close();
        return deserializedObject;
    }
    else
        throw FileNotFoundException("There is no file named", "D:\\my.bin");
}

假设您的方法返回object类型的对象,但您只在try块内返回,并且也从if语句内返回。因此,如果您的条件失败,您的方法将不会返回任何内容。另外,如果try块中存在异常,则在返回对象之前,您的方法将无法返回任何内容。这就是为什么会出现错误。您可以通过从try/catch块外部返回null来修复这个问题

虽然这将修复您的错误,但您应该寻找其他选项,如在找不到文件时引发异常,或返回错误对象

你可以试试这个

public static object LoadObject()
 {
   try
     {
       if (File.Exists("D://my.bin"))
         {
            FileStream stream = File.OpenRead("D://my.bin");
            BinaryFormatter formatter = new BinaryFormatter();

            Dictionary<int, Question> deserializedObject = (Dictionary<int, Question>)formatter.Deserialize(stream);
            stream.Close();
            return deserializedObject;
         }
     }
    catch
       {
         return null;
       }
     return null;
 }

正如错误消息所示,所有代码路径都必须返回一个值。有两种情况下不返回值:

如果文件不存在。 如果抛出异常。 将代码更改为:

try
{
    if (File.Exists("D://my.bin"))
    {
       ...
       return deserializedObject;
    }
}
catch
{

}
return null; // Or return an empty dictionary with:
             // return new Dictionary<int, Question>();

如果发生异常,您的方法将不返回任何内容。它必须始终返回一个对象。空的catch块的用途是什么?你希望它能做什么?错误仍然是sameI不会因为缺少更好的选项而盲目地返回null。当我想返回null时,我会返回null。如果我没有更好的选择,我会在我的方法的设计中寻找根本性的缺陷。@AntP我不同意。当然,最好的方法总是找到设计中的缺陷,但并不禁止从方法返回null。在这种情况下,如果文件不存在,您还可以将此方法设计为返回null。然而,我更喜欢抛出一个异常,让调用方处理这种情况。我没有说从一个方法返回null是禁止的,甚至没有说返回null是不好的;然而,仅仅因为不确定还需要做什么而返回任何值是不好的。如果没有有效的执行路径,那么抛出异常(正如您所说)是正确的做法;不只是返回空值并希望得到最好的结果。
try
{
    if (File.Exists("D://my.bin"))
    {
       ...
       return deserializedObject;
    }
}
catch
{

}
return null; // Or return an empty dictionary with:
             // return new Dictionary<int, Question>();