Я только что заметил этот вопрос и хотел добавить к нему свои 0,02 доллара.
В случае Java это вообще не вариант. Ошибка «недоступного кода» возникает не из-за того, что разработчики JVM думали защитить разработчиков от чего-либо или проявлять особую бдительность, а из требований спецификации JVM.
И компилятор Java, и JVM используют так называемые «карты стека» - определенную информацию обо всех элементах в стеке, выделенных для текущего метода. Тип каждого слота стека должен быть известен, чтобы инструкция JVM не использовала элемент одного типа для другого. Это в основном важно для предотвращения использования числового значения в качестве указателя. Возможно, используя сборку Java, попытаться отправить / сохранить число, но затем вывести / загрузить ссылку на объект. Однако JVM отклонит этот код во время проверки класса, то есть когда карты стека создаются и проверяются на согласованность.
Чтобы проверить карты стека, виртуальная машина должна пройти через все пути кода, существующие в методе, и убедиться, что независимо от того, какой путь кода будет когда-либо выполняться, данные стека для каждой инструкции соответствуют тому, что было отправлено любым предыдущим кодом. / хранится в стеке. Итак, в простом случае:
Object a;
if (something) { a = new Object(); } else { a = new String(); }
System.out.println(a);
в строке 3 JVM проверит, что обе ветви if были сохранены только в (который является просто локальным var # 0) что-то, что совместимо с Object (поскольку именно так код из строки 3 и далее будет обрабатывать локальную var # 0 ).
Когда компилятор доходит до недостижимого кода, он не совсем знает, в каком состоянии стек может быть в этот момент, поэтому он не может проверить его состояние. На этом этапе он больше не может полностью компилировать код, так как он также не может отслеживать локальные переменные, поэтому вместо того, чтобы оставить эту неоднозначность в файле класса, он выдает фатальную ошибку.
Конечно, простое условие вроде if (1<2)
обманет его, но на самом деле это не обман - оно дает ему потенциальную ветвь, которая может привести к коду, и, по крайней мере, и компилятор, и виртуальная машина могут определить, как элементы стека могут быть использованы оттуда. на.
PS Я не знаю, что делает .NET в этом случае, но я считаю, что компиляция тоже не удастся. Обычно это не проблема для компиляторов машинного кода (C, C ++, Obj-C и т. Д.).