2016-12-30 41 views
0

我试图在找到字符串匹配后返回一个值。我使用下面的代码。为什么我在使用if语句时遇到“不是所有路径都返回值”

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

但是,我得到错误“不是所有的路径都返回一个值”我以为我能这样做。我真的需要特定一个返回变量吗?

+4

如果没有任何匹配,您希望您的代码执行什么操作? – SLaks

+0

在此方法上,仅返回属性的值。 –

+4

但是如果你的'if'不匹配? – SLaks

回答

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

试试这个:

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; 
+0

你必须在'somevalue = property.GetValue(prop).ToString();'之后添加'return'语句,并在第一次匹配时停止循环 – user3598756

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),或者你想抛出一个不同类型的错误/执行一些其他动作。

相关问题