【发布时间】:2012-03-26 14:22:38
【问题描述】:
Enumerable.AsEnumerable<T>(this IEnumerable<T> source) 的实现只返回source。然而Observable.AsObservable<T>(this IObservable<T> source) 返回一个订阅源的AnonymousObservable<T> 而不是简单地返回源。
我知道这些方法对于在单个查询中更改 monad 非常有用(从 IQueryable => IEnumerable 开始)。那么为什么实现不同呢?
Observable 版本更具防御性,因为您无法将其转换为某些已知类型(如果它最初是作为 Subject<T> 实现的,您将永远无法将其转换为这样的类型)。那么为什么Enumerable 版本不做类似的事情呢?如果我的基础类型是List<T>,但将其公开为IEnumerable<T> 到AsEnumerable,则可以转换回List<T>。
请注意,这不是关于如何公开IEnumerable<T> 而不能够转换到底层的问题,而是为什么Enumerable 和Observable 之间的实现在语义上是不同的。
【问题讨论】:
-
AsEnumerable的源代码:github.com/Microsoft/referencesource/blob/master/System.Core/… 我找不到AsObservable的源代码。
标签: c# linq ienumerable system.reactive