gpt4 book ai didi

c# - 返回接口(interface)类型列表

转载 作者:太空狗 更新时间:2023-10-30 00:42:09 24 4
gpt4 key购买 nike

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

Apple:Resource
Banana:Resource
Orange:Resource

我在另一个类中列出了每个类型的操作:

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;
}
}

这给了我以下错误:

Cannot implicitly convert type 'System.Collections.Generic.List<Fruits.Apple>' to 'System.Collections.Generic.List<Fruits.Resource>'

我认为它会像我一样工作:

foreach (Resource r in Fruitlist) {
r.Meth();
}

最佳答案

由于不存在而导致代码中断的功能称为泛型协变。 C# 确实支持 variance in generics ,但仅限于接口(interface)(不是具体类)。

foreach片段之所以有效,是因为它对待 Fruitlist作为IEnumerable<Fruit> ,因为这是一个带有 out 的通用接口(interface)(协变)类型参数,编译器可以将其视为 IEnumerable<Resource> .

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

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

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

关于c# - 返回接口(interface)类型列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17118227/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com