【发布时间】:2017-01-14 16:15:33
【问题描述】:
谁能解释一下这个非常奇怪的观察结果?
我一直在尝试从 IronPython 内部调用 Rx 扩展方法,结果证明这是不可能的。我把它归结为这个简单的例子:
import clr
clr.AddReference("System.Core")
from System.Linq import Enumerable
def process(value):
return Enumerable.Select(value, lambda x:x)
在这种情况下,我们从普通的 LINQ 开始。如果我使用数组或任何其他 IEnumerable 对象从托管环境中调用 process 函数,它完全可以正常工作。
然后我尝试简单地替换引用以使用 Observable 扩展方法,如下所示:
import clr
clr.AddReference("System.Reactive.Linq")
from System.Reactive.Linq import Observable
def process(value):
return Observable.Select(value, lambda x:x)
在这种情况下,如果我使用 IObservable 对象调用 process 函数,调用会崩溃并显示一条丑陋的错误消息:
expected IObservable[object], got Select[int, int]
有人遇到过这样的事情吗?我错过了什么吗?是否有一些特殊情况可以使Enumerable 与缺少Observable 的lambda 代表一起工作?我不得不承认我在这里完全感到困惑。
顺便说一句,作为健全性检查,以下示例可以正常工作:
import clr
clr.AddReference("System.Reactive.Linq")
from System.Reactive.Linq import Observable
def process(value):
return Observable.Sum(value)
我想把它留在那里只是为了明确问题确实出在对Observable.Select的方法调用中。
【问题讨论】:
-
我在 IronPython 存储库中提交了一个issue 以获取更多发现。我现在认为这是 IronPython 方法调用解析的一个更普遍的错误,但仍然希望能更深入地了解这个问题。
标签: linq system.reactive ironpython reactivex