2011-10-10 83 views
-1

我想創建一個具有屬性和它們各自的訪問器的集合。C#...不是所有的代碼路徑返回值

這裏是我的代碼:

class SongCollection : List<Song> 
{ 
    private string playedCount; 
    private int totalLength; 

    public string PlayedCount 
    { 
     get 
     { 
      foreach (Song s in this) 
      { 
       if (s.TimesPlayed > 0) 
       { 
        return s.ToString(); 
       } 
      } 
     } 
    } 


    public int TotalLength 
    { 
     get 
     { 
      foreach (Song s in this) 
      { 
       int total = 0; 
       total += s.LengthInSeconds; 
      } 
      return total; 
     } 
    } 
} 

我收到錯誤的「獲取」點。它告訴我,並不是所有的代碼路徑都返回一個值......這意味着什麼,我錯過了什麼?

+1

我認爲你需要檢討你的設計。特別是你的'PlayedCount'屬性。 – ChaosPandion

+1

您忘記返回if語句 – Holystream

回答

6

首先,你得到消息的原因是,如果thisforeach塊內空的,那麼代碼(這是所需的return語句所在的位置)永遠不會執行。

但是,你TotalLength()函數將總是返回前Song的長度,因爲你聲明你的變量,其值設置,那麼foreach塊內返回它。相反,你需要做這樣的事情:

int totalLength = 0; 

foreach(Song s in this) 
{ 
    total += s.LengthInSeconds; 
} 

return totalLength; 

PlayedCount功能相似的問題而下降(如果集合爲空或包含其TimesPlayed屬性爲大於0,那麼就沒有辦法沒有元素它會返回一個值),所以根據你的評論來判斷你可以這樣寫:

public int PlayedCount() 
{ 
    int total = 0; 

    foreach(Song s in this) 
    { 
     if (s.TimesPlayed > 0) 
     { 
      total++; 
     } 
    } 

    return total; 
} 
+0

之外另外,'if'可能永遠不會評估爲真(在'PlayedCount'中)。 –

+0

@AnonyPegram謝謝,我甚至沒有看第一個函數。 –

+0

我創建這些訪問器,以便當我在main()函數中創建並填充List <>時,可以使用它們訪問它們。我可以在班級本身填充清單嗎? – iggy2012

0

就像它說的那樣,並不是所有的代碼路徑都返回一個值。

在這種情況下,如果您的列表爲空,則無法調用返回。在foreach中,必須至少有一個代碼才能執行。現在,也許你知道,名單將始終包含一個值,但編譯器無法知道

0

如果這個沒有評估,你的方法會返回什麼?

if (s.TimesPlayed > 0) 
       { 
        return s.ToString(); 
       } 

嘗試使用其他返回一個空字符串或東西

0

事實上,「這」可能在這種情況下,沒有songs-的循環不會在所有的執行並沒有隱含的返回值在C#中。

此外,除非你只收藏了一首歌曲,否則你的獲得者並沒有什麼意義。你需要這樣的東西更多:

public int TotalLength() 
{ 
    get 
    { 
     int total = 0; 
     foreach (Song s in this) 
     { 
      total += s.LengthInSeconds; 
     } 
     return total;  
    } 
} 

最後,不知道你是如何跟蹤TimesPlayed的每個單獨的歌曲,我不知道如何實現吸氣,但我相信你一定能弄清楚這麼多。

相關問題