10

C#には汎用ワイルドカードがなく、汎用メソッドでも同様の効果が得られることは承知していますが、フィールドでワイルドカードを使用する必要があり、それをエンコードする方法があるかどうかを判断できません。

List<State<Thing>> list;

void AddToList<T>() where T : Thing {
    list.Add(new State<T>());
}

もちろん、追加されるオブジェクトはタイプではなく、タイプState<Thing>であるため、これは機能しませんState<T> where T : Thing。リストの最も内部的なタイプを、? extends Thing単なるJavaではなくJavaと同等になるように調整することは可能Thingですか?

4

3 に答える 3

4

List<T>C#4には追加の分散サポートがありますが、さまざまな理由でこの場合には適用されないことに注意してください(「in」メソッドと「out」メソッドの両方があり、クラスです)。

ただし、これに対処する方法は次のようなものだと思います。

interface IState { // non-generic
    object Value { get; } // or whatever `State<Thing>` needs
}
class State<T> : IState {
    public T Value { get { ...} } // or whatever
    object IState.Value { get { return Value; } }
}

List<IState> list; ...

これにより、任意のを追加できるようになりますState<T>。それは実際には多くを使用せず、からTに到達するためにキャストが必要になりますが、....少なくとも機能します。objectT

于 2011-12-08T07:08:30.800 に答える
3

あなたはこのようなことを試すことができます:

    interface IState<out T> { }
    class State<T> : IState<T> { }
    class Thing {}

    List<IState<Thing>> list;

    void AddToList<T>() where T : Thing
    {
        list.Add(new State<T>());
    }
于 2011-12-08T08:32:00.517 に答える
0

次のようにリストを宣言します。

class State<T> where T : Thing
{
    ...

    List<State<T>> list = new List<State<T>>();
    // or
    public class StateList<T> : List<State<T>>
    {
         void AddToList(T item);
    }
}

その後、コンパイラは変換できるようになります。

于 2011-12-08T09:26:43.797 に答える