[英]Return list of interface type
我有三個繼承自相同界面的clasess:
Apple:Resource
Banana:Resource
Orange:Resource
我在另一個類中列出了每個類型為op的類型:
private List<Apple> apples = new List<Banana>();
private List<Banana> bananas = new List<Empleado>();
private List<Orange> oranges = new List<Orange>();
現在我想要一個可以返回任何列表的方法,讓我們這樣說:
public List<Resource> getListOf(string resource)
{
switch (resource)
{
case "apple":
return apples;
break;
case "bananas":
return bananas;
break;
case "oranges":
return oranges;
break;
default:
Console.WriteLine("wrong fruit");
break;
}
}
這給了我以下錯誤:
無法將類型'
System.Collections.Generic.List<Fruits.Apple>
'隱式轉換為'System.Collections.Generic.List<Fruits.Resource>
'
我認為它的工作方式與我能做的相同:
foreach (Resource r in Fruitlist) {
r.Meth();
}
使代碼中斷的特征稱為泛型類型協方差 。 C#支持泛型中的差異 ,但僅支持接口(不是具體類)。
foreach
片段之所以有效,是因為它將Fruitlist
視為IEnumerable<Fruit>
,因為這是一個帶有out
(協變)類型參數的通用接口,編譯器可以將其視為IEnumerable<Resource>
。
如果getListOf
返回IEnumerable<Resource>
是可以接受的,那么更改函數簽名將使代碼編譯。 否則編譯器將無法保證類型安全,因為您可以編寫此代碼:
List<Resource> apples = this.getListOf("apple");
apples.Add(new Orange()); // adding a Resource to a List<Resource>, right?
另一種選擇是返回非泛型類型,在這種情況下,類型安全性將再次丟失,編譯器將引入運行時檢查以確保您不將蘋果與橙子混合(但至少代碼可以工作,如果它是行為良好)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.