当使用IObservable
时,这一行将无法编译:
var x = receiver.Updates().Subscribe(OnNewMessage);
我得到这个错误:
Error 3 Argument 1: cannot convert from 'method group' to 'System.IObserver<IMyClass>'
和这个错误:
Error 2 The best overloaded method match for 'System.IObservable<IMyClass>.Subscribe(System.IObserver<IMyClass>)' has some invalid arguments
源代码使用IObservable
错误
Argument 1: cannot convert from 'method group' to 'System.IObserver<IMyClass>'
如果您了解术语,是非常清楚的。它被引发是因为。net框架基类库System.IObservable<T>
接口定义了一个签名为:
IDisposable Subscribe(System.IObserver<T>)
,你正在传递一个方法组。方法组顾名思义就是一组方法。特别地,在本例中,它是作用域中名称为OnNewMessage
的一组方法。它是通过传递不带括号的方法名来指定的。使用方法组是一种简写,它使编译器使用方法重载解析来查找可以转换为类型化委托的方法。当然,System.IObserver<T>
类型不可能存在这样的方法,因为它不是类型化委托。
当忘记包含包含所需扩展方法的程序集和/或忘记包含该扩展方法所需名称空间的using
语句时,会经常出现此错误。
在这种情况下,目的显然是为了满足响应式扩展框架定义的扩展方法——Rx在IObservable<T>
上定义了许多扩展方法,这些方法是构建观察者的方便简写——这是System.IObserver<T>
接口的实现——并将其一次性订阅到一个可观察对象。观察者接口定义了以下三个方法:
void OnNext(T value);
void OnError<T>(Exception error);
void OnCompleted();
Rx提供的各种扩展方法在system . react . core中定义,并使用提供的Action
以各种组合构建Observer
实现,以实现上述契约。我已经在Rx的源代码中给出了它们的定义。最简单的是接受OnNext
处理程序并为OnError
和OnCompleted
方法提供默认实现的方法。它看起来像这样:
public static IDisposable Subscribe<T>(
this IObservable<T> source, Action<T> onNext);
这些扩展方法是在System
命名空间中定义的,所以除了引用System.Reactive.Core
程序集(在nuget包Rx-Core
中,尽管大多数用户至少需要Rx-Main
提供的额外库)之外,还必须在源文件中有一个using System;
声明。
第二个错误:
The best overloaded method match for
'System.IObservable<IMyClass>.Subscribe(System.IObserver<IMyClass>)'
has some invalid arguments.
也是同样的情况,确认了编译器可以找到的最佳方法(在这种情况下可能是提供的方法组的唯一方法)不能转换为Subscribe
方法的单个IObserver<T>
参数的所需类型。
这是一个相当无益的错误。
如果你正在使用RX和IObservable,那么解决方案是在你的项目中添加以下程序集:
System.Reactive.Core.dll
System.Reactive.Interfaces.dll
System.Reactive.Linq.dll
System.Reactive.PlatformServices.dll
或者,你可以使用NuGet在你的项目中添加响应式扩展。
一旦你添加了这些程序集,如果你正在使用ReSharper,那么它会帮助你添加正确的"using"指令。