D-Kishore Ответов: 1

Не все пути кода возвращают значение в C#


Привет Разработчикам,

У меня есть простая функция, как указано ниже:

public static string GetCodeName(int machineId)
        {
            var dc = new CEWBDataContext();
            var codename = ModelTypes(machineId, dc).Select(x => x.CodeName).ToList();
            if (codename.Any())
                return codename.FirstOrDefault();
        }


Я сталкиваюсь с ошибкой подписи говоря
"
Not all code paths return a value
"

что не так в приведенном выше коде.

Что я уже пробовал:

Я попробовал ниже, и он отлично работает. Но в чем же проблема с приведенным выше кодом
if (codename.Count > 0)
               return codename.ToList()[0];
           else
               return null;

1 Ответов

Рейтинг:
2

David_Wimbley

Ваша проблема именно такова, как она утверждает, и то, что вы пробовали, является вашим точным решением.

В вашем коде есть условие, которое гласит: if(codename.Any()) { return codename.FirstOrDefault(); } но у тебя нет другого состояния.

Ваш метод должен возвращать строку независимо от того, в каком виде она находится. Если нет кодового имени вы должны вернуться string.Empty или null.

Экс: if(codename.Any()) { return codename.FirstOrDefault(); } else { return string.Empty; }

Затем в той части вашего кода, которая использует этот метод, вам нужно реализовать какую-то обработку ошибок, чтобы сказать var codename = MyClass.GetCodeName(1); if(string.IsNullOrEmpty(codename) { //do some sort of error here, throw an exception, do something about the error...etc }

У вас должно быть условие else или тернарный оператор в вашем методе GetCodeName. Нет никакого способа обойти это.


D-Kishore

Спасибо вам, но мы используем этот FirstOrdefault(), я думал, что это будет заботиться, если значение также будет иметь значение null.

David_Wimbley

First или default не имеет ничего общего с тем, как работает метод или доступные возвращаемые значения.

Метод должен иметь возвращаемое значение независимо от его значения. Оператор if является предотвращение какого-либо значения, возвращаемые, если кодовое имя.Any() является ложным. Если это правда, то у вас есть возвращаемое значение.

Основываясь на вашем комментарии, кажется, что вам нужно избавиться от вашего оператора if и просто вернуть FirstOrDefault, так как проверка .Any() является избыточной.

Пример: Изменение
если (кодовое имя.Какой-нибудь())
верните кодовое имя.Метода firstordefault();

Чтобы просто

верните кодовое имя.Метода firstordefault();

Это должно выполнить то, что вы, кажется, указываете, что вам нужно. Независимо от любого содержимого в списке кодовых имен, он будет возвращать first или default (в данном случае null, если список пуст).

D-Kishore

Спасибо Дэвиду, что прояснил мои разъяснения.

Richard Deeming

NB: Так как вы используете FirstOrDefault- тебе это не нужно if блок вообще. Не нужно ToList вызов.

var dc = new CEWBDataContext();
return ModelTypes(machineId, dc).Select(x => x.CodeName).FirstOrDefault();