2

ジェネリックの問題に直面しています:

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
    }

メソッドのシグネチャで T が IEntity であることを指定すると、「'System.Action<T>' から 'System.Action<IEntityCheck>... に変換できません」というメッセージが表示されるのはなぜですか?

4

3 に答える 3

3

試す:

public void AddAction(Action<IEntity> handle) 
{
    actions.Add(handle);
}

また、add関数の場合、型パラメーターを追加する必要はありません。インターフェースを使用するだけです。

public void Add(IEntity entity)
{
    list.Add(entity);
}

問題は、(機能した場合)インターフェイスで定義されていない具象クラスのメンバーを使用public void AddAction<T>(T entity) where T : IEntityするような関数を渡すことができ、リストをループしてそれらすべてを呼び出すことができないことです。他のいくつかの実装とそれらすべてを成功させます。Foo(ConcreteEntity entity)Actions<IEntity>IEntity

于 2012-11-30T23:50:01.710 に答える
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);
    }
}
于 2012-11-30T23:53:10.227 に答える