“使用foreach的方法中,并非所有代码路径都返回值”错误消息

时间:2013-05-30 17:23:22

标签: c#

让我感到困扰的是。我弄清楚了。我需要做的是搜索列表'列表'中名为'nazwisko'的家伙。如果没有这样的家伙那么我必须返回null;语言是C#。

任何帮助表示感谢。

Pracownik Search(string nazwisko)
{
    foreach (Pracownik pracownik in List)
    {
       if (List.Contains(pracownik))
          return pracownik;
       else
          return null;
    }
}

6 个答案:

答案 0 :(得分:5)

如果List不包含任何元素,则不会返回任何内容:

Pracownik Search(string nazwisko)
{
    foreach (Pracownik pracownik in List)
    {
       if (List.Contains(pracownik))
          return pracownik;
       else
          return null;
    }

    // Adding this will correct
    return null;
}

话虽如此,没有必要使用foreach,因为你实际上总是返回第一个元素。这将做同样的事情:

Pracownik Search(string nazwisko)
{
      return List.FirstOrDefault();
}
  

我需要做的是搜索列表'List'中名为'nazwisko'的家伙。

如果您打算将第一个匹配元素返回到搜索字符串,我建议:

Pracownik Search(string nazwisko)
{
      return List.FirstOrDefault(item => item.Name == nazwisko);
}

答案 1 :(得分:2)

您的所有代码路径都不会返回值。

   Pracownik Search(string nazwisko)
    {
       if (List == null) return null; //return if your list is null.

        foreach (Pracownik pracownik in List)
        {
           if (pracownik.someProp.Equals(nazwisko))
              return pracownik;
        }
        return null; //or something here
    }

在这种情况下,编译器在编译期间不知道List是否为null或为空。如果List为null / empty,则函数永远不会返回,因为它永远不会进入返回值的for循环内的代码路径。

如果您使用的是Linq,则可以重写为

   Pracownik Search(string nazwisko)
   {
      if(List == null) return null;

      return List.FirstOrDefault(x=> x.someProp.Equals(nazwisko));
   }

答案 2 :(得分:1)

Pracownik Search(string nazwisko)
{
    Pracownik retVal = null;
    foreach (Pracownik pracownik in List)
    {
       if (List.Contains(pracownik))
       {
          retVal = pracownik;
          break;
       }
    }
    return retVal;
}

答案 3 :(得分:0)

如果列表为空,则不会返回。这就是为什么你需要在foreach循环结束后返回null。 如果出现错误,请尝试将接收函数返回的变量定义为可为空。

答案 4 :(得分:0)

您必须考虑以下事实:如果List为null,则foreach语句可能永远不会被进一步评估。因此:

 Pracownik Search(string nazwisko)
    {
        foreach (Pracownik pracownik in List)
        {
           if (List.Contains(pracownik))
              return pracownik;
           else
              return null;
        }
    // This is where the other path is.  What should it return if List is null?
     return null;
    }

但是我会检查你的函数的语法。我不确定它会完全符合您的意图。

编辑:

Pracownik Search(string nazwisko)
    {
        foreach (Pracownik pracownik in List)
        {
           if (pracownik.Property?.Equals(naxwisko))
              return pracownik;
        }
    // This is where the other path is.  What should it return if List is null?
     return null;
    }

这可能是更好的语法 - 不确定要比较的属性或对象是什么。

答案 5 :(得分:0)

你不希望在foreach循环中使用else,否则如果List中不存在第一个pracownik,你将立即返回null。另外,如果没有使用它,为什么要传递字符串参数?

Pracownik Search(string nazwisko)
{
    foreach (Pracownik pracownik in List)
    {
       if (List.Contains(pracownik))
          return pracownik;
    }
    return null;
}