C # ... Не все пути кода возвращают значение - PullRequest
0 голосов
/ 10 октября 2011

Я пытаюсь создать коллекцию со свойствами и соответствующими им аксессорами.

Вот мой код:

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». Он говорит мне, что не все пути кода возвращают значение ... Что именно это означает, и что мне не хватает?

Ответы [ 4 ]

6 голосов
/ 10 октября 2011

Во-первых, причина того, что вы получаете это сообщение, заключается в том, что если 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;
}
0 голосов
/ 10 октября 2011

Тот факт, что «this» может не иметь песен - в этом случае циклы не будут выполняться вообще, и в C # не будет неявного возвращаемого значения.

Кроме того, ваши геттеры не имеют смысла, если только в вашей коллекции не было только одной песни. Вам нужно что-то вроде этого:

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

Наконец, не зная, как вы отслеживаете TimesPlayed для каждой отдельной песни, я бы не знал, как реализовать этот геттер, но я уверен, что вы сможете с этим разобраться.

0 голосов
/ 10 октября 2011

Что бы возвратил ваш метод, если бы он не вычислялся?

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

попробуйте использовать else для возврата пустой строки или чего-то еще

0 голосов
/ 10 октября 2011

Это означает, что, как говорится, не все пути кода возвращают значение.

В этом случае, если ваш список пуст, он не может вызвать return.В foreach для выполнения кода должен быть хотя бы один элемент.Теперь, может быть, вы знаете, что список всегда будет содержать значение, но компилятор не может знать, что

...