6

これは可能でしょうか?(2010年とは違うので、自分で試すことはできません、ごめんなさい)

public interface IComplexList<out TOutput, in TInput> where TOutput : TInput
{
    public IEnumerator<TOutput> GetEnumerator();
    public void Add(TInput item);
}

public interface IList<T> : IComplexList<T, T>
{
}

正しければ、これを使用して、同じインターフェースで共変性と反変性を実際に実装できます。

4

3 に答える 3

8

さて、あなたの質問は、既存のIList<T>タイプのために少し混乱しています。ただし、以下コンパイルされます。

public interface IComplexList<out TOutput, in TInput> where TOutput : TInput
{
    IEnumerator<TOutput> GetEnumerator();
    void Add(TInput item);
}

public interface ISimpleList<T> : IComplexList<T, T>
{
}

拡張するように変更することもできますIEnumerable<TOutput>:

public interface IComplexList<out TOutput, in TInput>
    : IEnumerable<TOutput>
    where TOutput : TInput
{        
    void Add(TInput item);
}

public interface ISimpleList<T> : IComplexList<T, T>
{
}

さまざまな型を含める必要があるため、インデクサーは扱いにくいものです。あなたがすることができます:

TOutput Get(int index);
void Set(int index, TInput item);

そして、もちろん代わりにインデクサーを入れISimpleList<T>ます...

ISimpleList<T>ただし、基本的に TInput=TOutput を強制しているため、バリアントを使用することはできません。

別のアプローチは、出力から入力を分離することです。

public interface IReadableList<out T> : IEnumerable<T>
{
    T Get(int index);
}

public interface IWritableList<in T>
{
    void Add(T item);
    void Set(int index, T item);
}

 public interface IMyList<T> : IReadableList<T>, IWritableList<T> {}

次に、次のように記述できます。

public void Foo(IWritableList<string> x) { ... }

IMyList<object> objects = new MyList<object>();
Foo(objects);

の場合は逆ですIReadableList。言い換えれば、各側の分散を個別に許可しますが、2 つの側の分散を一緒に取得することはありません。

于 2009-08-11T08:49:35.227 に答える
5

いいえ、できません。あなたの例IList<T>では不変です。/を共変/反変であるIList<T>と宣言する必要があります。共変であるインターフェースを継承するだけでは、それを行うことはできません。inout

于 2009-08-11T08:45:58.953 に答える
0

読み取り/書き込みプロパティの実装も読み取り専用プロパティの実装と見なされる場合、IList(of T)をIReadableList(of Out T)およびIAddableList( In T)の。これらのインターフェイスに、定義される前にIList(Of T)に存在していたメンバーが含まれている場合、IList(Of T)を実装するコードはそれらの他のメンバーを自動的に実装します。残念ながら、IReadableListを共変にするには、読み取り専用のインデクサープロパティが必要です。IListの読み取り/書き込みプロパティの実装を置き換えることができませんでした。したがって、IList(Of T)を使用可能なIReadableList(Of Out T)から継承させると、IList(Of T)のすべての実装が破損します。

于 2010-12-23T17:22:18.717 に答える