我一直在使用接口,继承和泛型的c#写下面的代码:C#泛型协方差和逆变冲突
public interface IBasic
{
}
public class Basic : IBasic
{
}
public class AnotherBasic : Basic
{
}
public interface IWorker<in TBasic>
{
void Run(TBasic basic);
}
public class Worker : IWorker<Basic>
{
public void Run(Basic basic)
{
throw new System.NotImplementedException();
}
}
public class AnotherWorker : IWorker<AnotherBasic>
{
public void Run(AnotherBasic basic)
{
throw new System.NotImplementedException();
}
}
public void Test()
{
List<IWorker<IBasic>> workers = new List<IWorker<IBasic>>
{
new Worker(),
new AnotherWorker()
};
}
这段代码的问题是,工人和anotherworker类不适合于仿制药名单IWorker<IBasic>
谁是工人和基本班的工人的父母。事情是IWorker<in TBasic>
因为运行方法签名是逆变的,但是我需要它协变,以便填写List<IWorker<IBasic>>
。运行方法必须具有TBasic参数,并且我需要这个职责列表来实现责任链设计模式。我是否错过了某些东西,或者是否找到了使协变和逆变不互相排斥的理由?
你不能这样做,因为它不安全,例如'新的列表> {新的AnotherWorker()} [0] .Run(新的基本())'将编译,但在运行时失败。 –
Lee
这看起来像[XYProblem](https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)。无论您尝试使用此设计解决什么问题,如果您描述您尝试解决的实际问题,都可能用不同的设计解决。 – juharr
我明显可以通过多种方法解决这个问题,但是我希望这能够以我显示的方式工作 –