Tru*_*ufa 4 c# oop inheritance interface class
我有三个继承自相同界面的clasess:
Apple:Resource
Banana:Resource
Orange:Resource
Run Code Online (Sandbox Code Playgroud)
我在另一个类中列出了每个类型为op的类型:
private List<Apple> apples = new List<Banana>();
private List<Banana> bananas = new List<Empleado>();
private List<Orange> oranges = new List<Orange>();
Run Code Online (Sandbox Code Playgroud)
现在我想要一个可以返回任何列表的方法,让我们这样说:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
这给了我以下错误:
无法隐式将类型'
System.Collections.Generic.List<Fruits.Apple>' 转换为'System.Collections.Generic.List<Fruits.Resource>'
我认为它的工作方式与我能做的相同:
foreach (Resource r in Fruitlist) {
r.Meth();
}
Run Code Online (Sandbox Code Playgroud)
使代码中断的特征称为泛型类型协方差.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?
Run Code Online (Sandbox Code Playgroud)
另一种选择是返回非泛型类型,在这种情况下,类型安全性将再次丢失,编译器将引入运行时检查以确保您不将苹果与橙子混合(但至少代码可以工作,如果它是行为良好).
| 归档时间: |
|
| 查看次数: |
1147 次 |
| 最近记录: |