[英]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.