gpt4 book ai didi

c# - 使用 Reactive Extensions (RX) 如何解决编译错误 "cannot convert from ' 方法组' 到 'System.IObserver"

转载 作者:太空狗 更新时间:2023-10-30 00:10:27 29 4
gpt4 key购买 nike

当使用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 Framework 基类库 System.IObservable<T>接口(interface)定义了一个带有签名的方法:

IDisposable Subscribe(System.IObserver<T>)

并且您正在传递一个方法组。方法组顾名思义就是一组方法。特别是,在这种情况下,它是范围内名称为 OnNewMessage 的方法组。 .它通过传递不带括号的方法名称来指定。使用方法组是一种简写形式,它会导致编译器使用方法重载决策来查找可以转换为类型化委托(delegate)的方法。当然,对于 System.IObserver<T> 的类型,不存在这样的方法。因为它不是类型化委托(delegate)。

当忘记包含包含所需扩展方法的程序集和/或忘记包含 using 时,此错误经常出现。该扩展方法所需命名空间的声明。

在这种情况下,意图显然是为了满足 Reactive Extensions 框架定义的扩展方法——Rx 在 IObservable<T> 上定义了许多扩展方法。这是构建观察者的便捷简写 - 这是 System.IObserver<T> 的实现接口(interface) - 并一次性将其订阅到一个可观察对象。观察者接口(interface)定义了以下三个方法:

void OnNext(T value);
void OnError<T>(Exception error);
void OnCompleted();

Rx提供的各种扩展方法定义在System.Reactive.Core中并建立一个 Observer使用提供的实现 Action以各种组合来履行上述契约(Contract)。我已经在 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.

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

关于c# - 使用 Reactive Extensions (RX) 如何解决编译错误 "cannot convert from ' 方法组' 到 'System.IObserver",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24451118/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com