我一直在使用接口,繼承和泛型的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
我明顯可以通過多種方法解決這個問題,但是我希望這能夠以我顯示的方式工作 –