如何将两个类似的具体对象传递给具有在C#中实现泛型的接口参数的方法?

Iro*_*fin 5 c# generics interface

我有以下接口声明:

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

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

}
Run Code Online (Sandbox Code Playgroud)

我有两个具体的类,如下:

// 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; }
}
Run Code Online (Sandbox Code Playgroud)

最后,我有一个静态服务方法用于保存到数据库:

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

}
Run Code Online (Sandbox Code Playgroud)

我的问题是,如何将具体类型的发行版传递给我的静态方法?以下内容无法编译:

Distro d = new Distro();
UpdateDistro(d);
Run Code Online (Sandbox Code Playgroud)

错误是:

The best overloaded method match for UpdateDistro(IDistro<IOrderItem>)' has some invalid arguments

逆变是答案吗?我尝试添加<in T>到原始接口声明,但这增加了更多我无法解决的错误.这是我第一次深入涉及界面,我确信泛型增加了复杂性,因此这里可能存在根本缺乏理解.

Mik*_*wan 6

你试过这个:

public static void UpdateDistro<T>(IDistro<T> distro) 
  where T : IOrderItem
{  
} 
Run Code Online (Sandbox Code Playgroud)

编辑:

使用空的实现DistroItemPerishableItem类(都实现IOrderItem),我有以下编译没有错误:

Distro d = new Distro();
PerishableOrder p = new PerishableOrder();

UpdateDistro(d);
UpdateDistro(p);
Run Code Online (Sandbox Code Playgroud)