簡體   English   中英

如何將兩個相似的具體對象傳遞給具有在C#中實現泛型的接口參數的方法?

[英]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
{  
} 

編輯:

使用DistroItemPerishableItem類的空實現(都實現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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM