Подстановочные знаки в общих ограничениях C # - PullRequest
9 голосов
/ 08 декабря 2011

Мне известно, что в C # нет универсальных подстановочных знаков, и что подобный эффект может быть достигнут с помощью универсальных методов, но мне нужно использовать подстановочный знак в поле и не могу работать, если есть какой-либозакодируйте его.

List<State<Thing>> list;

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

Конечно, это не работает, потому что добавляемый объект не относится к типу State<Thing>, а к типу State<T> where T : Thing.Можно ли настроить наиболее внутренний тип списка, чтобы он был эквивалентен Java ? extends Thing, а не просто Thing?

Ответы [ 3 ]

4 голосов
/ 08 декабря 2011

Обратите внимание, что в C # 4 есть дополнительная поддержка отклонений, но она не применяется в случае List<T> по разным причинам (имеет методы "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, и для приведения значения от object к T потребуется приведение, но ... по крайней мере, оно будет работать.

3 голосов
/ 08 декабря 2011

Вы можете попробовать что-то вроде этого:

    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>());
    }
0 голосов
/ 08 декабря 2011

Объявите ваш список следующим образом:

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);
    }
}

, тогда компилятор сможет конвертировать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...