2011-10-10 55 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的每个单独的歌曲,我不知道如何实现吸气,但我相信你一定能弄清楚这么多。

相关问题