Нет, он не может этого сделать, поскольку нет способа выразить константу во времени для значения.
Если компилятор должен быть в состоянии это сделать, в коде, возвращающем значение, должна быть гарантия, что значение является постоянным и в течение цикла не изменится.
Но, в этом случае, вы можете добавлять новые строки в таблицу данных как часть вашего цикла, и, таким образом, вы можете сделать эту гарантию так, как вы это сделали.
Короче говоря, компилятор не будет выполнять эту оптимизацию, если конечный индекс будет отличным от переменной.
В случае переменной, где компилятор может просто посмотреть на код цикла и увидеть, что эта конкретная переменная не изменилась, он мог бы сделать это и загрузить значение в регистр перед началом цикла, но при любом исполнении выигрыш от этого, скорее всего, будет незначительным, если ваше тело цикла не пустое.
Вывод: Если вы знаете или хотите принять, что индекс конца цикла является постоянным на протяжении всего цикла, поместите его в переменную.
Редактировать: Перечитайте ваш пост, и да, вы можете увидеть незначительное повышение производительности также для ваших двух случаев, потому что JITter оптимизирует код. JITter может оптимизировать чтение конечного индекса для прямого доступа к переменной в таблице данных, содержащей количество строк, и чтение из памяти не так уж и дорого. Если, с другой стороны, чтение этого свойства является очень дорогой операцией, вы увидите более заметную разницу.