4

我有三个继承自同一个接口的类:

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();
}
4

1 回答 1

7

使代码因缺少而中断的特性称为泛型类型协方差。C# 确实支持泛型的变化,但只支持接口(不是具体的类)。

该代码段之所以有效,foreach是因为它将.FruitlistIEnumerable<Fruit>outIEnumerable<Resource>

如果getListOf返回 an是可以接受的,IEnumerable<Resource>那么更改函数签名将使代码编译。否则编译器将无法保证类型安全,因为您可以编写以下代码:

List<Resource> apples = this.getListOf("apple");
apples.Add(new Orange()); // adding a Resource to a List<Resource>, right?

另一种选择是返回非泛型类型,在这种情况下,类型安全将再次丢失,编译器将引入运行时检查以确保您不会将苹果与橙子混为一谈(但至少代码可以工作,如果它是乖巧)。

于 2013-06-14T22:37:30.000 回答