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"点收到错误。它告诉我不是所有的代码路径都返回值…这到底是什么意思,我错过了什么?

c# . .并非所有代码路径都返回值

首先,你得到这个消息的原因是,如果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,但我相信你可以用这些来弄清楚。