3

ここに質問を投稿するのはこれが初めてなので、事前に誰かに感謝します(そしておそらく他の人も)。

今日、私は C# 4 の共分散と反分散に戸惑いましたが、私がやりたいことを実行できる可能性はまったくありません。注:これは特定の問題を解決するためのものではありませんが、それを解決するための合法的な方法(C#4の真新しい共分散/反分散)があるかどうか知りたいです。だから、夢中にならないで...

サンプルコードは次のとおりです。

public interface IBase<in T>
{
    T GetValue();
    ...
}


public class Readable<T> : IBase<T>
{
    public T GetValue() {/* */}
    ...
}


public class Writeable<T> : IBase<T>
{
    public T GetValue() {/* */}
    public void SetValue(T value) {/* */}
    ...
}


public class Program
{
    private List<IBase<object>> _collection = new List<IBase<object>>();


    public static void Main()
    {
        var p = new Program();

        p._collection.Add(new Readable<bool>());    //not allowed
    }
}

コレクションは、任意の T の IBase 派生物をホストできる必要があります。もちろん、非ジェネリック コレクションまたはリストを使用することができ、ゲームは終了します。もう 1 つのアイデアは、より一般的なインターフェイス IBaseCore を使用して、IBase を継承することです。私の質問は次のとおりです。これらのトリックがなければ、IBase のコレクションを取得して、任意の IBase のアイテムを追加できますか?

みんなありがとう。

4

1 に答える 1

3

編集:まず最初に、あなたの分散は に対して間違っていIBase<T>ます。out T(反変) ではなく (共変) である必要がありますin T

ここでの問題は単純に、一般的な共変性と反変性が値型を型引数として機能しないことです。したがって、 を追加できますが、 は追加できReadable<string>ませんReadable<bool>

1 つのオプションは、非ジェネリックな基本インターフェイスを持つことです。

public interface IBase
{
    object GetValueAsObject();
}

public interface IBase<out T> : IBase
{
    T GetValue();
    ...
}

次に、 を持つことができますList<IBase>

于 2011-02-24T14:28:16.730 に答える