2016-12-30 44 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),或者你想拋出一個不同類型的錯誤/執行一些其他動作。

相關問題