为什么我在 foreach 中使用 if 时得到 "Not All paths return a value"

Why Am I getting "Not All paths return a value" when using if inside a foreach

我正在尝试 return 找到字符串匹配后的值。我正在使用以下代码。

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();

但是,我收到错误 "Not all paths return a value" 我以为我可以那样做。我真的需要指定一个 return 变量吗?

试试这个:

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;

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

场景:

  • pi是一个空数组,所以我们永远不会进入foreach循环。
  • none 个 property 值的名称等于给定的 prop 值。

下面的代码 return 是预期的结果(如果找到的话)。 但是,如果发生上述任何一种情况,它会继续 运行(因为它不会在 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.");

在这里抛出一个错误是一个有效的动作(也就是说,如果我们出错了,我们有一个不同的有效路径来退出我们不需要 return 值的函数),所以编译器现在很高兴。 然而,这可能不是您想要的行为(即,您可能想要 return 一个默认值(例如 null),或者您可能想抛出不同类型的错误/执行一些其他操作。

当您在 c# 中声明一个函数具有 return 值时,您 必须 return 相同数据类型的东西,否则会引发异常。您的代码缺少 "else" 情况,因此您没有 returning 任何东西。如果您想要一个默认值,请明确将其放在您的“else”中。否则,您可能想要声明一个 ApplicationException 并抛出它(在某种程度上这算作一个 return 值)。

根据你的具体情况,最好先声明一个变量,然后使用循环为其赋值,然后return那个。如果您初始化它,这将跳过对 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;