我们已经到了不知道如何继续的地步:
SHORT:我们有一个通用接口和一个通用接口的集合。尝试将通用接口的实现添加到集合失败。发生的事情是我得到一个编译时异常说:
无法从 TestApp.IState<T>' 转换为 TestApp.IState<TestApp.IView>'
LONG [代码示例]:
class Program
{
static void Main(string[] args)
{
var coll = new StateCollection();
var state = new SomeState();
coll.AddState(state);
}
}
public class StateCollection
{
private List<StateBase<IView>> _states = new List<StateBase<IView>>();
public void AddState<T>(StateBase<T> state) where T: IView
{
_states.Add(state);
}
}
public class SomeState : StateBase<SomeView>
{
public IView View
{
get;
}
}
public class SomeView : IView
{
}
public abstract class StateBase<T> where T : IView
{
private SomeView _view;
public SomeView View
{
get { return _view; }
}
}
public interface IView
{
}
为什么会这样?在 AddState 中,我们提到 T 必须是 IState 的一个实例。有人可以帮助我们了解为什么会发生这种情况以及如何做我们想做的事情吗?
EDIT1:我们也尝试过:
public void AddState(IState<IView> state)
{
_states.Add(state);
}
但这只是将编译时错误移动到 'coll.AddState(state)' 所以同样的事情发生在另一个地方。
EDIT2:问题!我没有给出正确的例子。Out IState 不是接口而是抽象类。对此非常抱歉!更改代码以使用抽象类