【问题标题】:Not all code paths return a value in c#并非所有代码路径都在 C# 中返回值
【发布时间】:2012-09-19 18:24:48
【问题描述】:
public int Queue()
    {
        using (Entities server = new Entities())
        {
            var ServerId1 = (from serverID in server.AppPM_Patches
                             where serverID.PatchStatus == "NotStarted" && serverID.ServerId == 1
                             select serverID.ServerId).Count();
            var ServerId2 = (from serverID in server.AppPM_Patches
                             where serverID.PatchStatus == "NotStarted" && serverID.ServerId == 2
                             select serverID.ServerId).Count();
            var ServerId3 = (from serverID in server.AppPM_Patches
                             where serverID.PatchStatus == "NotStarted" && serverID.ServerId == 3
                             select serverID.ServerId).Count();
            if (ServerId1 == 0 && ServerId2 == 0 && ServerId3 == 0)
            {
                return ServerId1;//Convert.ToInt32(ServerId1);

            }
            else if (ServerId1 == 1 && ServerId2 == 0 && ServerId3 == 0)
            {
                return ServerId2;
            }
            else if (ServerId1 == 1 && ServerId2 == 1 && ServerId3 == 0)
            {
                return ServerId3;
            }
            else if (ServerId1 > ServerId2 && ServerId1 > ServerId3)
            {
                if (ServerId2 > ServerId3)
                {
                    return ServerId3;
                }
                else
                {
                    return ServerId2;
                }
            }
            else if (ServerId2 > ServerId3 && ServerId2 > ServerId1)
            {
                if (ServerId1 > ServerId3)
                {
                    return ServerId3;
                }
                else
                {
                    return ServerId1;
                }
            }
            else if (ServerId3 > ServerId1 && ServerId3 > ServerId2)
            {
                if (ServerId1 > ServerId2)
                {
                    return ServerId2;
                }
                else
                {
                    return ServerId1;
                }
            }
            else if (ServerId1 == ServerId2 && ServerId2 == ServerId3 && ServerId1 == ServerId3)
            {
                return ServerId1;
            }
            else if (ServerId1 == ServerId2 && ServerId1 > ServerId3 && ServerId2 > ServerId3)
            {
                return ServerId3;
            }
            else if (ServerId2 == ServerId3 && ServerId2 > ServerId1 && ServerId3 > ServerId1)
            {
                return ServerId1;
            }
            else if (ServerId1 == ServerId3 && ServerId1 > ServerId2 && ServerId1 > ServerId3)
            {
                return ServerId1;
            }
        }
    }

我在方法中收到错误(并非所有代码路径都返回值)。此方法返回我定义的 int 值。但是即使我返回了一个 int 值,也不知道为什么会发生这个错误。谁能帮帮我?

【问题讨论】:

  • 我会尝试编写与此 SQL 等效的代码:... GROUP BY ServerID ORDER BY COUNT(x), ServerID 并获取第一条记录,因为当您添加 ServerID = 4, 5, ... n 时,您所拥有的会很糟糕。跨度>
  • +1 反对投票。问一个真正的问题没有错。

标签: c# c#-4.0


【解决方案1】:

你有一个if 和一堆else if 语句,但你没有else 语句。就编译器而言,完全可以想象不会满足任何if 条件。在这种情况下,该方法没有返回值。

您可以在else 语句中返回一个值,或者通常在if 构造之后返回一个值。或者,如果代码确实永远在不满足任何条件的情况下退出if 语句,那么您可以在方法结束时抛出异常以指示存在错误。异常是方法可接受的退出策略。

【讨论】:

    【解决方案2】:

    这里还有很多其他答案可以解决您的特定错误消息,但您的方法还有更多潜在问题被忽略了。您有大量的 if/else if 语句,它们非常长且复杂,只是为了返回 3 个整数中的最小值。有很多更简单的方法可以做到这一点。重构最少的方法是在查询后立即添加以下内容:

    return new[] { ServerId1, ServerId2, ServerId3  }.Min();
    

    但是,您可以重构查询本身,以便只执行一个查询,而不是三个,并且不要在三个不同的服务器 ID 中硬编码。这将允许您将 using 中的所有内容替换为:

    return (from serverID in server.AppPM_Patches
    where serverID.PatchStatus == "NotStarted"
    group serverID  by serverID.ServerId into servers
    select servers.Count())
    .Min();
    

    【讨论】:

    • 你的更好。删除我的。
    【解决方案3】:
        public int Queue()
            {
    
                    using (Entities server = new Entities())
                    {
    int retVal=0;//initialize it your value
                        var ServerId1 = (from serverID in server.AppPM_Patches
                                         where serverID.PatchStatus == "NotStarted" && serverID.ServerId == 1
                                         select serverID.ServerId).Count();
                        var ServerId2 = (from serverID in server.AppPM_Patches
                                         where serverID.PatchStatus == "NotStarted" && serverID.ServerId == 2
                                         select serverID.ServerId).Count();
                        var ServerId3 = (from serverID in server.AppPM_Patches
                                         where serverID.PatchStatus == "NotStarted" && serverID.ServerId == 3
                                         select serverID.ServerId).Count();
                        if (ServerId1 == 0 && ServerId2 == 0 && ServerId3 == 0)
                        {
                            retVal=ServerId1;//Convert.ToInt32(ServerId1);
    
                        }
                        else if (ServerId1 == 1 && ServerId2 == 0 && ServerId3 == 0)
                        {
                            retVal=ServerId2;
                        }
                        else if (ServerId1 == 1 && ServerId2 == 1 && ServerId3 == 0)
                        {
                            retVal=ServerId3;
                        }
                        else if (ServerId1 > ServerId2 && ServerId1 > ServerId3)
                        {
                            if (ServerId2 > ServerId3)
                            {
                                retVal= ServerId3;
                            }
                            else
                            {
                                retVal=ServerId2;
                            }
                        }
                        else if (ServerId2 > ServerId3 && ServerId2 > ServerId1)
                        {
                            if (ServerId1 > ServerId3)
                            {
                                retVal=ServerId3;
                            }
                            else
                            {
                                retVal=ServerId1;
                            }
                        }
                        else if (ServerId3 > ServerId1 && ServerId3 > ServerId2)
                        {
                            if (ServerId1 > ServerId2)
                            {
                                retVal=ServerId2;
                            }
                            else
                            {
                                retVal=ServerId1;
                            }
                        }
                        else if (ServerId1 == ServerId2 && ServerId2 == ServerId3 && ServerId1 == ServerId3)
                        {
                            retVal=ServerId1;
                        }
                        else if (ServerId1 == ServerId2 && ServerId1 > ServerId3 && ServerId2 > ServerId3)
                        {
                            retVal=ServerId3;
                        }
                        else if (ServerId2 == ServerId3 && ServerId2 > ServerId1 && ServerId3 > ServerId1)
                        {
                            retVal=ServerId1;
                        }
                        else if (ServerId1 == ServerId3 && ServerId1 > ServerId2 && ServerId1 > ServerId3)
                        {
                            retVal=ServerId1;
                        }
    
            return retVal;
                    }
            }
    

    【讨论】:

      【解决方案4】:

      您没有 else 案例,因此您没有涵盖所有案例。您可能在逻辑上涵盖了所有情况,但在语法上您没有。所以也许你可能想返回第一个服务器 ID 并添加

      else
      {
          return ServerId1;
      }
      

      【讨论】:

        【解决方案5】:

        如果你到达函数的末尾,你还没有返回任何东西。

        【讨论】:

          【解决方案6】:

          如果没有满足else ifs 或if 中的至少一个,则没有“默认”返回。

          在最后添加return,或将最后一个else if 更改为else

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-12-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-07-14
            • 1970-01-01
            相关资源
            最近更新 更多