Ковариация и контравариантность: как использовать оба в одном интерфейсе?

Как я могу использовать параметр out для универсального типа в своем интерфейсе и повторно использовать этот тип в качестве параметра метода или в качестве возврата функции, которая не является ковариантной?

См. образец (мой реальный случай — «Добавить (T элемент)», остальные — тесты):

public interface ITestAdapter<out T>
{
    void Clear(); // Compile

    T GetItemAt(int index); // Compile

    void Add(T item); // ERROR:  Invalid variance: The type parameter 'T' must be contravariantly valid on 'ITestAdapter<T>.Add(T)'. 'T' is covariant.
    IList<T> GetInnerList(); //ERROR: Invalid variance: The type parameter 'T' must be invariantly valid on 'ITestAdapter<T>.GetInnerList()'. 'T' is covariant.

    IEnumerable<T> GetInnerAsEnumerable(); // Compile
}

public class TestAdapter<T> : ITestAdapter<T>
{
    public TestAdapter(IList<T> innerList)
    {
        this._innerList = innerList;
    }

    private readonly IList<T> _innerList;

    public void Clear()
    {
        this._innerList.Clear();
    }

    public void Add(T item)
    {
        this._innerList.Add(item);
    }

    public T GetItemAt(int index)
    {
        return this._innerList[index];
    }

    public IList<T> GetInnerList()
    {
        return this._innerList;
    }

    public IEnumerable<T> GetInnerAsEnumerable()
    {
        return this._innerList;
    }
}

public class A { }
public class AB : A { }

public class Test
{
    public static void Doy()
    {
        var list = new List<AB>();
        var typed = new TestAdapter<AB>(list);
        var boxed = default(ITestAdapter<A>);
        boxed = typed; // OK;
    }
}

person Manofgoa    schedule 18.05.2017    source источник
comment
comment
Не совсем так, как вы можете видеть в моем примере, GetInnerList(); это просто тест, и решение (GetInnerAsEnumerable()) такое же, как в сообщении, на которое вы ссылаетесь. В моем случае я хочу использовать универсальный тип в качестве параметра (метод Add()).   -  person Manofgoa    schedule 18.05.2017
comment
Причина та же. Поскольку этот тип является контравариантным, вы не можете использовать его в качестве входных данных. Лучшее объяснение здесь: stackoverflow.com/a/5043054/149436   -  person Evan Trimboli    schedule 18.05.2017