使用反应式扩展(RX)如何解决编译错误"cannot convert from 'method group' to 'System.IObserver"



当使用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处理程序并为OnErrorOnCompleted方法提供默认实现的方法。它看起来像这样:

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"指令。

相关内容

最新更新