У меня есть следующие объявления интерфейса:
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);
Ошибка:
The best overloaded method match for UpdateDistro(IDistro<IOrderItem>)' has some invalid arguments
Является ли контрвариантность ответом?Я попытался добавить <in T>
к исходному объявлению интерфейса, но это добавило больше ошибок, которые мне не удалось устранить.Это мое первое углубленное знакомство с интерфейсами, и я уверен, что дженерики увеличивают сложность, поэтому здесь может быть полное отсутствие понимания.