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.
错误
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处理程序并为OnError和OnCompleted方法提供默认实现的那个.它看起来像这样:
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.
| 归档时间: |
|
| 查看次数: |
1485 次 |
| 最近记录: |