Ключевое слово readonly затрудняет работу компилятора C #. Он не может знать, есть ли у MoveNext () и Current побочные эффекты, которые нарушают контракт только для чтения. MoveNext (), безусловно, делает. Таким образом, чтобы сгенерировать правильный код, он должен создать копию значения итератора. Это происходит дважды, один раз для вызова метода MoveNext (), снова при чтении свойства Current. Это легко увидеть, запустив в своей программе ildasm.exe, копия которого называется CS $ 0 $ 0001 в сборке отладки.
Было бы неплохо, если бы компилятор хотя бы сгенерировал предупреждение для этого кода. Очень трудно сделать точно, хотя, действительно нужно знать, есть ли у участника побочный эффект. Это не знает. way слишком много структурных типов со средствами получения свойств, которые не имеют побочного эффекта, поэтому просто всегда генерировать предупреждение невозможно.
Тип функции, которая потребуется, чтобы сообщить об этом, - это ключевое слово const , как оно используется в C ++. Метод может быть объявлен как const, чтобы указать, что он не изменяет состояние объекта. Я серьезно сомневаюсь, что эта функция когда-нибудь превратится в язык C #, хотя написание const-правильного кода не так просто и, честно говоря, немного лаконично.