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