簡體   English   中英

如果在foreach中使用時為什么會得到“並非所有路徑都返回值”的原因

[英]Why Am I getting “Not All paths return a value” when using if inside a foreach

一旦它找到字符串匹配項,我試圖返回一個值。 我正在使用以下代碼。

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

但是,我收到錯誤消息“並非所有路徑都返回值”,我認為我能夠這樣做。 我真的需要特定的返回變量嗎?

正如@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 ),或者您可能想引發其他類型的錯誤/執行一些其他操作。

當您在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;

嘗試這個:

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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM