为什么我在foreach中使用if时会得到“Not Not path返回值”

时间:2016-12-30 15:52:23

标签: c# if-statement foreach return-value nested-loops

我试图在找到字符串匹配后返回一个值。我正在使用以下代码。

MetadataIcons mi = new MetadataIcons();
Type me = mi.GetType();
PropertyInfo[] pi = me.GetProperties();

foreach (var property in pi)
    if (property.Name.ToLower().Equals(prop.ToLower()))
        return property.GetValue(prop).ToString();

但是,我收到错误“并非所有路径返回值”我认为我能够这样做。我真的需要特定一个返回变量吗?

3 个答案:

答案 0 :(得分:3)

正如@SLaks在评论中指出的那样,理论情况下代码可能不会返回任何值。在实践中,这些可能永远不会发生,但编译器只知道它看到了什么,并且它看到了这种可能性。

方案:

  • pi是一个空数组,因此我们永远不会进入foreach循环。
  • property个值中没有一个名称等于给定的prop值。

以下代码返回预期结果(如果找到)。 但是,如果出现上述任一情况,它将继续运行(因为它不会在return语句中退出),因此会转到新行throw new NotImplementedException ...;这会导致抛出错误。

MetadataIcons mi = new MetadataIcons();
Type me = mi.GetType();
PropertyInfo[] pi = me.GetProperties();

foreach (var property in pi)
    if (property.Name.ToLower().Equals(prop.ToLower()))
        return property.GetValue(prop).ToString();
throw new NotImplementedException("I haven't yet decided what to do should this condition arise.");

抛出错误是一个有效的操作(即好像我们错误,我们有一个不同的有效路由退出我们不需要返回值的函数),所以编译器现在很高兴。 但是,这可能不是您想要的行为(即您可能想要返回默认值(例如null),或者您可能想要抛出不同类型的错误/执行其他操作。

答案 1 :(得分:3)

当您声明函数在c#中具有返回值时,必须返回相同数据类型的内容或抛出异常。您的代码缺少“else”情况,因此您不会返回任何内容。如果您需要默认值,请将其明确放在“else”中。否则,您可能需要声明ApplicationException并抛出它(在某种程度上计为返回值)。

在您的特定情况下,最好先声明一个变量,然后使用循环来赋值,然后返回它。如果您初始化它,则会跳过else的需要。

 string retval = string.Empty;
    foreach (var property in pi)
        if (property.Name.ToLower().Equals(prop.ToLower()))
            {
               retval = property.GetValue(prop).ToString();
               break; //stop looping
            }

    return retval;

你也可以使用!否定if布尔结果并以这种方式执行:

    string retval = string.Empty;
        foreach (var property in pi)
        {
            if (!(property.Name.ToLower().Equals(prop.ToLower())))
                {
                   continue; //jump out of this iteration and go to the next                  
                }
            retval = property.GetValue(prop).ToString();              
        }
        return retval;

答案 2 :(得分:2)

试试这个:

MetadataIcons mi = new MetadataIcons();
Type me = mi.GetType();
PropertyInfo[] pi = me.GetProperties();
string somevalue = "";
foreach (var property in pi){
    if (property.Name.ToLower().Equals(prop.ToLower())){
        somevalue = property.GetValue(prop).ToString();}
}
return somevalue;