Примечание Это не вопрос о том, как реализовать или эмулировать утиную печать на С#...
В течение нескольких лет у меня создалось впечатление, что некоторые функции языка С# не зависят от структур данных, определенных в самом языке (который всегда казался мне странным сценарием курица и яйца). Например, у меня создалось впечатление, что цикл foreach
доступен только для использования с типами, которые реализовали IEnumerable
.
С тех пор я понял, что компилятор С# использует утиную типизацию, чтобы определить, можно ли использовать объект в цикле foreach, ища метод GetEnumerator
, а не IEnumerable
. Это имеет большой смысл, поскольку он удаляет куриную и яичную головоломку.
Я немного смущен, почему это не похоже на блок using
и IDisposable
. Есть ли какая-то особая причина, по которой компилятор не может использовать утиную печать и искать метод Dispose
? В чем причина этой несогласованности?
Возможно, что что-то еще происходит под капотом с IDisposable?
Обсуждая, почему вы когда-либо имели объект с методом Dispose, который не реализовал IDisposable, выходит за рамки этого вопроса:)