【问题标题】:Why does SubscribeOn does not work here as a extension method but as a direct call?为什么 SubscribeOn 在这里不能作为扩展方法,而是作为直接调用?
【发布时间】:2014-09-11 07:21:46
【问题描述】:

我有 ObserverBase 类。在 Start 方法中,我订阅了一个 observable,应用了转换和过滤器。

我不明白为什么使用 SubscribeOn 作为扩展方法无法编译。 谁能解释这种行为?

public class ObserverBase<T1, T2> : IPeer<T1, T2>
{

    private readonly ISubject<T2> subject;

    private readonly IMapper<T1, T2> messageMapper;

    protected ObserverBase(ISubject<T2> subject, IMapper<T1, T2> messageMapper)
    {
        this.subject = subject;
        this.messageMapper = messageMapper;
    }

    public IObservable<T2> Start(IObservable<T1> observable, Func<T2, bool> predicate)
    {
        //works
        Synchronization.ObserveOn(Synchronization.SubscribeOn(observable, TaskPoolScheduler.Default),
                                  Scheduler.Immediate)
                  .Select(message => this.messageMapper.Map(message))
                  .Where(predicate)
                  .Subscribe(observation => this.subject.OnNext(observation));


        // compile error on SubscribeOn: The type arguments cannot be inferred from the usage. Try specifying the type argument explicitly.
        observable.SubscribeOn(TaskPoolScheduler.Default).ObserveOn(Scheduler.Immediate)
                  .Select(message => this.messageMapper.Map(message))
                  .Where(predicate)
                  .Subscribe(observation => this.subject.OnNext(observation));

        // compile error on TaskPoolScheduler.Default: Cannot resolve method SubscribeOn(System.Reactive.Concurrency.TaskPoolScheduler)
        observable.SubscribeOn<T1>(TaskPoolScheduler.Default).ObserveOn(Scheduler.Immediate)
                  .Select(message => this.messageMapper.Map(message))
                  .Where(predicate)
                  .Subscribe(observation => this.subject.OnNext(observation));

        return this.subject;
    }
}

【问题讨论】:

  • "...作为扩展方法无法编译" - 您需要提供编译错误。

标签: c# compiler-errors resharper extension-methods system.reactive


【解决方案1】:

这对我有用 - 您是否为 System.Reactive.Linq 命名空间(其中定义了 SubscribeOn)包含了 using 语句? Synchronization.ObserveOn 位于不同的命名空间 (System.Reactive.Concurrency) - 我怀疑您已经有 using 语句。

【讨论】:

    【解决方案2】:

    扩展方法在重载解析链中非常低:它们不够“接近”:http://ericlippert.com/2013/12/23/closer-is-better/

    您可能会发现这个答案也很有用:https://stackoverflow.com/a/25564127/863564 它似乎与您的问题直接相关。

    【讨论】:

      【解决方案3】:

      Visual Studio 编译代码,但 ReSharper 报告了这些错误。重新启动 Visual Studio 后,ReSharper 停止抱怨。

      【讨论】:

      • 啊! Resharper...这是一种爱恨交织的关系!
      • 有没有它你都活不下去
      猜你喜欢
      • 1970-01-01
      • 2017-01-21
      • 1970-01-01
      • 2011-12-09
      • 1970-01-01
      • 2011-02-25
      • 2012-07-13
      • 2012-01-15
      • 1970-01-01
      相关资源
      最近更新 更多