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>到原始接口声明,但这增加了更多我无法解决的错误.这是我第一次深入涉及界面,我确信泛型增加了复杂性,因此这里可能存在根本缺乏理解.
你试过这个:
public static void UpdateDistro<T>(IDistro<T> distro)
where T : IOrderItem
{
}
Run Code Online (Sandbox Code Playgroud)
编辑:
使用空的实现DistroItem和PerishableItem类(都实现IOrderItem),我有以下编译没有错误:
Distro d = new Distro();
PerishableOrder p = new PerishableOrder();
UpdateDistro(d);
UpdateDistro(p);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
359 次 |
| 最近记录: |