почему в этом случае компилятор не жалуется? - PullRequest
3 голосов
/ 12 января 2010

это код:

 private TreeNode GetTopLevelNode(TreeNode childNode)
    {
        if (childNode == null)
            throw new ArgumentNullException("childNode", "childNode is null.");

        if (childNode.Parent == null) return childNode;

        TreeNode node = childNode;
        while (true)
        {
            if (node.Parent == null)
            {
                return node;
            }
            node = node.Parent;
        }

    }

в цикле while, только если node.Parent == null, будет возвращен узел,

почему компилятор не сообщает об ошибке «не все пути кода возвращают значение»?

если 'node.Parent == null' не может быть удовлетворен, то никакой узел дерева не будет возвращен Компилятор не может обнаружить эту ситуацию?

Ответы [ 5 ]

10 голосов
/ 12 января 2010

Поскольку вы используете while(true){, нет другого способа выйти из цикла, кроме использования возврата. если node.parent == null не может быть удовлетворено, то это будет бесконечный цикл. Поэтому нет способа обойти цикл без возврата, и компилятор не жалуется.

Кроме того, указанный вами код почти всегда будет возвращать ноль TreeNode, это то, что вы действительно хотели?

Редактировать: Я вижу, вы исправили это.

9 голосов
/ 12 января 2010

Ваш вопрос на самом деле является одним из самых глубоких и интересных вопросов в области компьютерных наук. Эта проблема известна как проблема остановки: проблема, для данной программы, определить, всегда ли она возвращается или работает всегда.

Проблема остановки известна тем, что она доказуемо не разрешима компьютерами . Не существует алгоритма, который мог бы надежно сказать вам, останавливается ли данная программа. Вы можете доказать, что такая программа либо (1) дает неправильные ответы, (2) не может анализировать все программы, либо (3) сама иногда никогда не останавливается.

Поэтому компилятор C # не пытается решить проблему остановки. Скорее, мы просто обнаруживаем, что «while (true)» и отсутствие разрывов означают, что цикл никогда не остается «вне дна», и, следовательно, конечная точка метода недоступна. Ошибка «не все пути кода возвращают значение» на самом деле означает : «существует путь кода, который выходит из метода, но не возвращает значение». не означает, что «существует кодовый путь, который выполняется вечно», потому что для его решения необходимо решить проблему остановки.

1 голос
/ 12 января 2010

Компилятор понимает, что функция вернет TreeNode во всех случаях, когда она завершится. Во всех случаях, когда функция возвращает, она вернёт правильное значение. Поэтому нет случаев, когда было бы возвращено неопределенное значение, и компилятор не видит причины для предупреждения.

Если функция не возвращается, нет смысла интересоваться возвращаемым значением.

1 голос
/ 12 января 2010

Если у вас неограниченная глубина или петля , то время будет продолжаться вечно.

Так что либо цикл застрянет, либо в какой-то момент Parent будет нулевым. Он никогда не входит через некоторое время, так как он не заканчивается.

1 голос
/ 12 января 2010

Компилятор умный и оптимизирует ваш цикл. Он знает, что единственный выход - вернуться после того, как условие if (node.Parent == null) вернет true.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...