我遇到了泛型问题:
public interface IEntity {}
public class User : IEntity {}
public class Experiments {
private IList<IEntity> list;
private IList<Action<IEntity>> actions;
public Experiments(){
list = new List<IEntity>();
actions = new List<Action<IEntity>>();
}
public void Add<T>(T entity) where T : IEntity {
list.Add(entity); // -> NO PROBLEM HERE
}
public void AddAction<T>(Action<T> handle) where T : IEntity {
actions.Add(handle); // -> HERE I GET AN ERROR
}
为什么我“无法转换为'System.Action&lt; T&gt;'到'System.Action&lt; IEntityCheck&gt; ...“一旦我在方法的签名上指定T是IEntity?
答案 0 :(得分:3)
尝试:
public void AddAction(Action<IEntity> handle)
{
actions.Add(handle);
}
对于你的添加功能,不需要添加类型参数,只需使用界面。
public void Add(IEntity entity)
{
list.Add(entity);
}
public void AddAction<T>(T entity) where T : IEntity
的问题是我可以(如果有效)传递像Foo(ConcreteEntity entity)
那样使用具体类的成员的函数,这个函数没有在接口上定义,那么我就不会能够循环遍历Actions<IEntity>
列表并使用IEntity
的其他实现调用它们并使它们都成功。
答案 1 :(得分:3)
我设法通过在类级声明泛型类型来编译它。
public interface IEntity { }
public class User : IEntity { }
public class Experiments<T> where T : IEntity
{
private IList<T> list;
private IList<Action<T>> actions;
public Experiments()
{
list = new List<T>();
actions = new List<Action<T>>();
}
public void Add(T entity)
{
list.Add(entity);
}
public void AddAction(Action<T> handle)
{
actions.Add(handle);
}
}
答案 2 :(得分:2)
谢谢大家的答案,我找到了解决问题的方法。
我刚刚更改了操作 List&lt; Action&lt; T&gt;&gt;列出&lt; Delegate&gt; ,现在一切正常......
...
private IList<IEntity> list;
private IList<Delegate> actions;
public void AddAction<T>(Action<T> handle) where T : IEntity {
actions.Add(handle);
}
...
感谢。