Общий C # вопрос - PullRequest
       3

Общий C # вопрос

6 голосов
/ 13 сентября 2011

В следующем классе есть два метода, в которых M1 жалуются «не все пути кода возвращают значение», а M2 - нет.

Вопрос: Как компилятор разрешает M2 в контексте возвращаемого значения? Как экземпляр NotImplementedException неявно приводится к типу int (если есть внутреннее разрешение во время компиляции)

class A
        {
            int M1()
            {
            }
            int M2()
            {
                throw new NotImplementedException();
            }
        }

Ответы [ 4 ]

7 голосов
/ 13 сентября 2011

Метод не всегда требуется для возврата значения;в частности, ему также разрешается выход, выдавая исключение (в этом случае значение не возвращается).

Редактировать: В частности, правила для тела метода, которые возвращают int:

  1. Все операторы return в методе должны возвращать выражение, конвертируемое в int
  2. Конец блока метода не долженбыть достижимым

В вашем примере компилятор может доказать, что M2 всегда завершается с помощью броска, поэтому конец блока метода недоступен (удовлетворяет правилу № 2).Также нет операторов return, что также удовлетворяет правилу № 1.Следовательно, это правильное определение метода.

С другой стороны, M1 не удовлетворяет правилу # 2, поэтому оно недопустимо.

Возможно, вас вводит в заблуждение сообщение об ошибке, котороене упоминать throwing вообще, но учтите, что почти во всех случаях методы с возвращаемыми значениями делают return вместо throw - компилятор просто говорит, что вы хотите, чтобы вы, вероятно, забыли сделать.

2 голосов
/ 13 сентября 2011

Исключения влияют на поток кода.Любые операторы после броска не будут выполнены, компилятор может доказать это, так что доволен путем через метод.

Исключение не приведет к возвращению int, ничего не будет возвращено внормальный смысл.Вместо этого генерируется исключение, CLR обрабатывает их по-разному.

http://msdn.microsoft.com/en-us/library/ms173160(v=vs.80).aspx

0 голосов
/ 13 сентября 2011

Как указано в MSDN ,

Оператор throw используется для оповещения о возникновении аномальной ситуации (исключение) во время выполнения программы.

Когда выполнение кода запускается в операторе throw , программа останавливается и пользователю показывается сообщение об исключении (если программист не указал никакой логики обработки ошибок)

0 голосов
/ 13 сентября 2011

Исключение не будет приведено как int.Компилятор знает, что это исключение, которое всегда будет достигнуто, поэтому не жалуется.Когда выбрано исключение, оно размотает стек до блоков обработки исключений или сбоя.Int никогда не будет возвращен вызывающему методу.

...