[英]How do I pass two similar concrete objects to a method with interface parameters that implement generics in 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);
錯誤是:
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
{
}
編輯:
使用DistroItem
和PerishableItem
類的空實現(都實現IOrderItem
),可以進行以下編譯而不會出現錯誤:
Distro d = new Distro();
PerishableOrder p = new PerishableOrder();
UpdateDistro(d);
UpdateDistro(p);
您可以在接口中定義協變泛型參數,盡管需要確保稍微改變接口,以確保T
不反向使用:
public interface IOrder<out T> where T : IOrderItem
{
IEnumerator<T> Items { get; }
}
public interface IDistro<out T> : IOrder<T> where T : IOrderItem
{
}
要將T
定義為Coverient參數( out
),允許對實現您的變體接口的類進行隱式轉換。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.