c# . .并非所有代码路径都返回值
本文关键字:路径 返回值 代码 | 更新日期: 2023-09-27 18:11:01
我正在尝试创建一个具有属性和各自访问器的集合。
下面是我的代码: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;
}
}
}
我在"get"点收到错误。它告诉我不是所有的代码路径都返回值…这到底是什么意思,我错过了什么?
首先,你得到这个消息的原因是,如果this
是空的,那么foreach
块内的代码(这是所需的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;
}
这意味着正如它所说的,并非所有代码路径都返回值。
在这种情况下,如果你的列表是空的,那么它不能调用return。在foreach中,必须至少有一个项目供代码执行。现在,也许您知道列表将始终包含一个值,但编译器无法知道
如果这个没有求值,你的方法会返回什么?
if (s.TimesPlayed > 0)
{
return s.ToString();
}
尝试使用else返回空字符串或其他
事实上'this'可以没有歌曲-在这种情况下循环根本不会执行,并且c#中没有隐式返回值。
此外,除非你的集合中只有一首歌,否则你的getter就没有意义。你需要更多像这样的东西:
public int TotalLength()
{
get
{
int total = 0;
foreach (Song s in this)
{
total += s.LengthInSeconds;
}
return total;
}
}
最后,如果不知道如何跟踪每首歌的timesplay,我就不知道如何实现getter,但我相信你可以用这些来弄清楚。