我正在处理响应式扩展,我遇到了一个我无法为我的生活找出原因的障碍。
如果我使用 .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);
}
}
}
DaftFrog 只是我的假 DAL 类中的一个测试类,这是一个简单的 .NET 4 类库项目,DaftFrog 类是一个包含几个字段的简单 poco,dal.save 方法只是简单地做了一个 console.WriteLine DaftFrog 对象中的一个字段。
一旦我开始让 RX 代码工作,这两个类都只是真实事物的简单替代品。
无论如何,回到问题,所以上面的代码工作正常,如果我做一些
_subject.OnNext(new DaftFrog());
调用,假 dal 类,打印出我所期望的,一切正常......
然而>....
如果我然后按原样将此代码传输到类库,然后从我的“静态程序”中新建该类库,如下所示:
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);
}
}
}
然后在我的程序中使用那个类
using System;
using RxProducer;
namespace Runner
{
class Program
{
private static readonly Producer _myProducer = new Producer();
static void Main()
{
_myProducer.Start();
while(!line.Contains("quit"))
{
_myProducer.Tick();
line = Console.ReadLine();
}
_myProducer.Stop();
}
}
}
然后我的项目无法编译。
具体来说,它失败了:
_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
起初我以为它可能是静态的东西,所以我将类库中的所有内容都设置为静态,这根本没有区别。
直到现在我真的没有对 Rx 做太多事情,但我 99% 的时间都在使用 C# 和 VS,所以我知道错误告诉我它不能转换某种描述的类型,我只是不'不明白为什么它告诉我,尤其是当代码在静态程序中完美运行时,但在类库中却没有。
肖蒂
更新
Second thoughts, I just know there are going to be those who insist that I post the fakedal and daft frog definitions, even though IMHO they won't be required, but to pacify the hordes of pretenders who will ask here they are :-)
using System;
namespace FakeDal
{
public class Repository<T>
{
public void Save(T entity)
{
Console.WriteLine("Here we write T to the database....");
}
}
}
namespace FakeDal.Entites
{
public class DaftFrog
{
public int Id { get; set; }
public string Name { get; set; }
public bool IsTotalyDaft { get; set; }
}
}