我有以下接口(interface)声明:
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>
到原始接口(interface)声明,但这增加了我无法解决的更多错误。这是我第一次深入研究接口(interface),我确信泛型增加了复杂性,因此这里可能缺乏基本的理解。
最佳答案
你试过这个吗:
public static void UpdateDistro<T>(IDistro<T> distro)
where T : IOrderItem
{
}
编辑:
DistroItem
和 PerishableItem
类(均实现 IOrderItem
)的空实现,我得到了以下编译且没有错误:
Distro d = new Distro();
PerishableOrder p = new PerishableOrder();
UpdateDistro(d);
UpdateDistro(p);
关于c# - 如何将两个相似的具体对象传递给具有在 C# 中实现泛型的接口(interface)参数的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9773526/