使用Reactive Extensions(RX)如何解决编译错误"无法从'方法组'转换为'System.IObserver"

Con*_*ngo 5 c# system.reactive

使用时IObservable,此行不会编译:

var x = receiver.Updates().Subscribe(OnNewMessage);
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

Error   3   Argument 1: cannot convert from 'method group' to 'System.IObserver<IMyClass>'      
Run Code Online (Sandbox Code Playgroud)

而这个错误:

Error   2   The best overloaded method match for 'System.IObservable<IMyClass>.Subscribe(System.IObserver<IMyClass>)' has some invalid arguments    
Run Code Online (Sandbox Code Playgroud)

源代码使用IObservable.

Jam*_*rld 8

错误

Argument 1: cannot convert from 'method group' to 'System.IObserver<IMyClass>' 
Run Code Online (Sandbox Code Playgroud)

如果您理解术语,则非常清楚.之所以引发它,是因为.NET Framework基类库System.IObservable<T>接口使用签名定义了一个方法:

IDisposable Subscribe(System.IObserver<T>)
Run Code Online (Sandbox Code Playgroud)

而你正在传递一个方法组.一个方法组实际上就是它所说的一组方法.特别是,在这种情况下,它是范围内具有名称的方法组OnNewMessage.通过传递没有括号的方法名称来指定它.使用方法组是一种简写,它使编译器使用方法重载解析来查找可以转换为类型委托的方法.当然,对于某种类型而言,不存在这样的方法,System.IObserver<T>因为它不是类型化的委托.

如果忘记包含包含所需扩展方法的程序集和/或忘记包含该using扩展方法所需命名空间的语句,则会出现此错误.

在这种情况下,目的显然是满足Reactive Extensions框架定义的扩展方法--Rx定义了许多扩展方法,IObservable<T>这是构建观察者的一种方便的简写- 这是System.IObserver<T>接口的实现- 并将其订阅到可以一次观察.观察者接口定义了以下三种方法:

void OnNext(T value);
void OnError<T>(Exception error);
void OnCompleted();
Run Code Online (Sandbox Code Playgroud)

Rx提供的各种扩展方法在System.Reactive.Core中定义,并Observer使用提供的Actions以各种组合构建实现以实现上述合同.我已经在Rx的源代码中链接到这些的实际定义.最简单的是接受OnNext处理程序并为OnErrorOnCompleted方法提供默认实现的那个.它看起来像这样:

public static IDisposable Subscribe<T>(
    this IObservable<T> source, Action<T> onNext);
Run Code Online (Sandbox Code Playgroud)

这些扩展方法在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.
Run Code Online (Sandbox Code Playgroud)

也是一样的,确认编译器可以找到的最佳方法(在这种情况下可能是提供的方法组的唯一方法)不能转换为方法的单个IObserver<T>参数的必需类型Subscribe.