10

我知道 C# 没有通用通配符,并且可以通过通用方法实现类似的效果,但是我需要在字段中使用通配符,并且无法确定是否有任何方法对其进行编码。

List<State<Thing>> list;

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

当然,这不起作用,因为要添加的对象不是 type State<Thing>,而是 type State<T> where T : Thing。是否可以将列表的最内部类型调整为 Java 等价物? extends Thing而不仅仅是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,并且需要演员才能从objectto T,但是....它至少会起作用。

于 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 回答