簡體   English   中英

返回接口類型列表

[英]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.

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