执行Enumerable.AsEnumerable<T>(this IEnumerable<T> source)
只需返回source
。但Observable.AsObservable<T>(this IObservable<T> source)
返回订阅源的AnonymousObservable<T>
,而不是简单地返回源。为什么AsObservable和AsEnumerable的实现不同?
我知道这些方法对于在单个查询(从IQueryable => IEnumerable)中更改monad非常有用。那么为什么这些实现有所不同?
Observable
版本更具防御性,因为您无法将其转换为某种已知类型(如果原始版本实施为Subject<T>
,您将无法将其转换为此类版本)。那么为什么Enumerable
版本不做类似的事情?如果我的基础类型是List<T>
,但将其公开为IEnumerable<T>
到AsEnumerable
,则可以将其重新转换为List<T>
。
请注意,这不是关于如何暴露IEnumerable<T>
而不能转换为底层的一个问题,但为什么Enumerable
和Observable
之间的实现在语义上的不同。
感谢您的解释。我最近在Bart De Smet的Channel 9上观看了一段视频,他解释了IQbservable,它与IObservable有关系。从他解释的方式来看,它听起来像AsObservable是AsEnumerable的模拟,因为任何可观察的行为都会在本地发生,而不是远程发生。我完全误解了这个(可能是......),还是仅仅是AsObservable的另一个用法? – RichK 2012-03-26 14:42:57
我不知道。我建议问巴特德斯梅特那个问题。 – 2012-03-26 14:44:29
好的,谢谢,可能是一个好主意。在提问之前,我确实阅读了文档 - 但是由于我之前的评论中提到的视频导致了混淆 – RichK 2012-03-26 14:48:04