Как передать два похожих конкретных объекта в метод с параметрами интерфейса, который реализует дженерики в C#?

У меня есть следующие объявления интерфейса:

interface IOrder<T> where T: IOrderItem
{
     IList<T> Items { get; set; }
}

interface IDistro<T> : IOrder<T> where T: IOrderItem
{

}

У меня есть два конкретных класса, например:

// DistroItem implements IOrderItem
public class Distro : IDistro<DistroItem>
{
    public IList<DistroItem> Items { get; set; }
}

// PerishableOrderItem implements IOrderItem
public class PerishableOrder : IDistro<PerishableOrderItem>
{       
    public IList<PerishableOrderItem> Items { get; set; }
}

Наконец, у меня есть статический сервисный метод для сохранения в базу данных:

public static void UpdateDistro(IDistro<IOrderItem> distro)
{

}

Моя проблема в том, как мне передать дистрибутив любого конкретного типа моему статическому методу? Следующее не компилируется:

Distro d = new Distro();
UpdateDistro(d);

Ошибка:

Лучшее соответствие перегруженного метода для UpdateDistro(IDistro)' имеет некоторые недопустимые аргументы

Контравариантность является ответом? Я попытался добавить к исходному объявлению интерфейса, но это добавило больше ошибок, которые я не смог устранить. Это мой первый подробный обзор интерфейсов, и я уверен, что дженерики добавляют сложности, поэтому здесь может быть фундаментальное непонимание.

5
задан IronicMuffin 19 March 2012 в 16:12
поделиться