続行する方法がわからないところまで来ました。
短い: ジェネリック インターフェイスとジェネリック インターフェイスのコレクションがあります。ジェネリック インターフェイスの実装をコレクションに追加しようとすると失敗します。何が起こるかというと、次のようなコンパイル時の例外が発生します。
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 はインターフェイスではなく、抽象クラスです。大変申し訳ありません!抽象クラスを使用するようにコードを変更