为什么SubscribeOn不能作为扩展方法在这里工作,而是直接调用?

时间:2014-09-11 07:21:47

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

我有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;
    }
}

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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