【发布时间】:2011-09-16 04:09:00
【问题描述】:
注意这不是一个关于如何在 C# 中实现或模拟鸭子类型的问题...
几年来,我的印象是某些 C# 语言特性依赖于语言本身定义的数据结构(这对我来说总是很奇怪)。例如,我的印象是 foreach 循环只能用于实现 IEnumerable 的类型。
从那时起,我开始明白 C# 编译器使用鸭子类型来确定对象是否可以在 foreach 循环中使用,寻找 GetEnumerator 方法而不是 IEnumerable。这很有意义,因为它消除了先有鸡和先有蛋的难题。
我有点困惑,为什么using 块和IDisposable 似乎不是这种情况。编译器是否有任何特殊原因不能使用鸭子类型并寻找Dispose 方法?这种不一致的原因是什么?
也许 IDisposable 的幕后还有其他事情发生?
讨论为什么你会曾经拥有一个带有未实现 IDisposable 的 Dispose 方法的对象,这超出了这个问题的范围:)
【问题讨论】:
-
+1 有趣。你能提供关于
foreach的观点的来源吗? -
@harpo 我刚刚“发现”了 MattDavey 所做的事情。我在下面发布了一些代码作为答案,尽管从技术上讲它本身并不是答案。
-
Eric Lippert 在被问到这个问题后不久就写了一篇博文:blogs.msdn.com/b/ericlippert/archive/2011/06/30/…
-
这里是关于 foreach 的一个很好的解释,stackoverflow.com/a/398996/1160036。简而言之,对象不需要实现
IEnumerable接口,它们只需要一个GetEnumerator()方法,该方法返回一个具有MoveNext()和Current的对象。 -
@MattDavey 该链接无效。
标签: c# compiler-construction idisposable duck-typing