В каком случае эта функция не будет возвращать значение?Почему компилятор сообщает об ошибке? - PullRequest
5 голосов
/ 30 июня 2011
public static int Test(int n)
{
  if (n < 0) return 1;
  if (n == 0) return 2;
  if (n > 0) return 3;
}

Компилятор (Visual Studio 2010, C # 4.0) говорит: «Не все пути кода возвращают значение». Почему?

Ответы [ 4 ]

10 голосов
/ 30 июня 2011

Компилятор не пытается определить, что он охватывает все возможные значения n.Все, что он видит, это то, что у вас есть три if утверждения, и предполагается, что all из них может быть ложным ... в этом случае вы достигнете конца метода, не возвращаяvalue.

См. в этом блоге Эрика Липперта для получения дополнительной информации об ограничениях компилятора, когда речь заходит о достижимости.

Просто сделайте окончательный возврат безусловным.

8 голосов
/ 30 июня 2011

Компилятор не смотрит на ваши условия. Даже если вы правы в том, что хотя бы один из ваших if-блоков будет работать, вам все равно потребуется рефакторинг примерно так:

if (n < 0)
    return 1;
else if (n == 0)
    return 2;
else
    return 3;
2 голосов
/ 30 июня 2011

Компилятор не достаточно умен, чтобы знать, что все эти ветви взаимоисключающие, поэтому его беспокоит случай, когда все три оператора if не будут выполнены.операторы с else и используют только else для последнего условия, или вы можете вернуть значение по умолчанию в конце.Это обойдет проблему.

1 голос
/ 30 июня 2011

Компилятор не знает, что вы охватили все свои базы.Вы можете переписать это так ...

public static int Test(int n)
{
  if (n < 0) return 1;
  else if (n == 0) return 2;
  else (n > 0) return 3;
}

или это ...

public static int Test(int n)
{
  if (n < 0) return 1;
  if (n == 0) return 2;
  if (n > 0) return 3;
  return 4; //will never occur
}
...