Visual studio 2010 Subject.Subscribe是否仅在静态实例中工作(或者我是否缺少某些内容)

Visual studio 2010 Subject.Subscribe是否仅在静态实例中工作(或者我是否缺少某些内容),visual-studio-2010,compiler-errors,system.reactive,Visual Studio 2010,Compiler Errors,System.reactive,我在做反应性扩展,而Iv'e遇到了一个我一生都无法解决的问题,那就是原因是什么 如果我使用.NET 4控制台模式应用程序,其中所有内容都是静态的,如下所示: using System; using System.Reactive.Subjects; using FakeDal; using FakeDal.Entites; using RxProducer; namespace Runner { class Program { private static readonly S

我在做反应性扩展,而Iv'e遇到了一个我一生都无法解决的问题,那就是原因是什么

如果我使用.NET 4控制台模式应用程序,其中所有内容都是静态的,如下所示:

using System;
using System.Reactive.Subjects;
using FakeDal;
using FakeDal.Entites;
using RxProducer;

namespace Runner
{
  class Program
  {
    private static readonly Subject<DaftFrog> _subject = new Subject<DaftFrog>();
    private static readonly Repository<DaftFrog> _frogRepo = new Repository<DaftFrog>();


    static void Main()
    {
      _subject.Subscribe(RespondToNewData);
    }

    private static void RespondToNewData(DaftFrog frog)
    {
      _frogRepo.Save(frog);
    }


  }
}
using System.Reactive.Subjects;
using FakeDal;
using FakeDal.Entites;

namespace RxProducer
{
  public class Producer
  {
    private readonly Subject<DaftFrog> _subject = new Subject<DaftFrog>();
    private readonly Repository<DaftFrog> _frogRepo = new Repository<DaftFrog>();

    private int _clock;

    public void Start()
    {
      _subject.Subscribe(RespondToNewData);
    }

    public void Stop()
    {
    }

    public void Tick()
    {
      if(_clock % 5 == 0)
      {
        DaftFrog data = new DaftFrog();
        _subject.OnNext(data);
      }
      _clock++;

    }

    private void RespondToNewData(DaftFrog frog)
    {
      _frogRepo.Save(frog);
    }
  }
}
呼叫,假dal类,打印出我期望的内容,一切正常

然而,>

如果我随后按原样将此代码传输到类库,然后从“静态程序”中重新创建该类库,如下所示:

using System;
using System.Reactive.Subjects;
using FakeDal;
using FakeDal.Entites;
using RxProducer;

namespace Runner
{
  class Program
  {
    private static readonly Subject<DaftFrog> _subject = new Subject<DaftFrog>();
    private static readonly Repository<DaftFrog> _frogRepo = new Repository<DaftFrog>();


    static void Main()
    {
      _subject.Subscribe(RespondToNewData);
    }

    private static void RespondToNewData(DaftFrog frog)
    {
      _frogRepo.Save(frog);
    }


  }
}
using System.Reactive.Subjects;
using FakeDal;
using FakeDal.Entites;

namespace RxProducer
{
  public class Producer
  {
    private readonly Subject<DaftFrog> _subject = new Subject<DaftFrog>();
    private readonly Repository<DaftFrog> _frogRepo = new Repository<DaftFrog>();

    private int _clock;

    public void Start()
    {
      _subject.Subscribe(RespondToNewData);
    }

    public void Stop()
    {
    }

    public void Tick()
    {
      if(_clock % 5 == 0)
      {
        DaftFrog data = new DaftFrog();
        _subject.OnNext(data);
      }
      _clock++;

    }

    private void RespondToNewData(DaftFrog frog)
    {
      _frogRepo.Save(frog);
    }
  }
}
然后我的项目无法编译

具体而言,它在线路上出现故障:

_subject.Subscribe(RespondToNewData);
在RxProducer类库中,更重要的是,编译器抛出的错误没有任何意义:

Error   1   The best overloaded method match for 'System.Reactive.Subjects.Subject<FakeDal.Entites.DaftFrog>.Subscribe(System.IObserver<FakeDal.Entites.DaftFrog>)' has some invalid arguments  H:\programming\rxtesting\RxProducer\Producer.cs 17  7   RxProducer

Error   2   Argument 1: cannot convert from 'method group' to 'System.IObserver<FakeDal.Entites.DaftFrog>'  H:\programming\rxtesting\RxProducer\Producer.cs 17  26  RxProducer
Error 1“System.Reactive.Subjects.Subject.Subscribe(System.IObserver)”的最佳重载方法匹配具有一些无效参数H:\programming\rxtesting\RxProducer\Producer.cs 17 7 RxProducer
错误2参数1:无法从“方法组”转换为“System.IObserver”H:\programming\rxtesting\RxProducer\Producer.cs 17 26 RxProducer
起初我认为它可能是静态的,所以我将类库中的所有内容都设置为静态的,这一点都没有区别

到目前为止,我对Rx还没有做太多的工作,但我99%的时间都在使用C#和VS,所以我知道错误告诉我它不能转换某种类型的描述,我只是不明白为什么它会告诉我,尤其是当代码在静态程序中完美地工作,而不是在类库中

肖蒂

更新 再想一想,我只知道会有人坚持要我发布fakedal和daft frog的定义,尽管我不需要它们,但我想这是为了安抚一大群冒充者,他们会问:-)

使用系统;
名称空间伪造
{
公共类存储库
{
公共作废保存(T实体)
{
WriteLine(“这里我们将T写入数据库…”);
}
}
}
名称空间FakeDal.Entites
{
公共类daftprog
{
公共int Id{get;set;}
公共字符串名称{get;set;}
公共bool IsTotalyDaft{get;set;}
}
}

听起来编译器在推断操作时遇到问题…可能缺少相关扩展方法的using语句。或者,尝试以下任一方法:

_subject.Subscribe ((Action<DaftFrog>) RespondToData);

包括
使用系统
转换到您拥有Producer的文件中,这将有助于将
RespondToNewData
转换为
IObserver

尝试1:更改为-\u subject.Subscribe((操作)RespondToNewData);导致错误更改为-预期一个带有'void respondtoneewdata()'符号的方法,我在键入时注意到有一个泛型类型版本,所以我只想尝试一下,您的观察者建议…对于那些感到疑惑的人,从未达到try 2,解决了上面的问题:-)我假设您实际上是指_subject.Subscribe((操作)响应数据);这将导致编译失败,但希望R#会建议导入与上述解决方案类似的using语句。这两个答案几乎都是正确的,tho.:-)@leecampbell呵呵-是的,当我用手机接听电话时,我的准确度大大降低了:)另外,不要挑剔,但我的第一句话是“可能遗漏了一条使用说明”,尽管是因为错误的原因。令人印象深刻的是,你用手机接听。美好的生活在未来的人中。而赢家是。。。。。这完全解决了。。。。。如果你有机会进一步阐述你的答案,我很好奇为什么会这样:-)通常当我需要一个程序集添加到我的uses子句中时,R会告诉我它是哪一个,但在这种情况下,R没有任何线索或建议。顺便说一下,这只是踢了我的头:-)总是简单的事情。。。在这个游戏中玩了30多年,它仍然是一个缺少的“或”(这让我大吃一惊:-)的现代等价物。您正在使用带有
操作
参数的方法
Subscribe
,该参数在
系统
名称空间中定义。编译器很聪明,它知道如何将委托/方法转换为
操作
(),但当你不指定系统时,它就不知道它能转换成什么。这就是我的理解,但我从未试图找到这个问题的根本原因,也许我在这方面不太正确。它对我有效,我没有时间去寻找:-)PS:你刚刚修复了一个让我挠头的大问题我为lidnug.org网站重新设计写的东西只是一条注释;添加using语句不会将RespondToNewData转换为IObservable,它允许解析所采取的扩展方法和映射到RespondToNewData委托/方法的操作。
_subject.Subscribe ((Action<DaftFrog>) RespondToData);
var obs = Observer.Create ( I forget the overload );
_subject.Subscribe( obs);