Nol*_*nar 10 c# generics covariance
由于我不知道我的问题是如何被调用的,我不能保证,没有人最近或根本没有问过同样的问题.
我注意到,但是有很多线程具有相似的标题,但它们似乎与我的问题无关.
我有一个自定义列表类,它实现了泛型.
class MyList<T>
{
public void add(T item) // adds an item to the list
{ /* code */ }
public void add(MyList<T> list) // attaches an existing list to the end of the current one
{ /* code */ }
}
Run Code Online (Sandbox Code Playgroud)
我也有课程:
class Apple : Fruit
Run Code Online (Sandbox Code Playgroud)
和
class Banana : Fruit
Run Code Online (Sandbox Code Playgroud)
现在,相关代码:
MyList<Fruit> fruitList = new MyList<Fruit>();
// fill fruitList
fruitList.add(new Apple()); // works, of course
fruitList.add(new Banana()); // works as well, of course
MyList<Apple> appleList = new MyList<Apple>();
// fill appleList
fruitList.add(appleList); // doesn't work. Why?
Run Code Online (Sandbox Code Playgroud)
尽管appleList是MyList(Of Apple)而Apple是Fruit,但当MyList(Of Fruit)被问到时,VisualStudio不接受MyList(Of Apple)作为参数.
但是,如果我要像这样声明列表:
MyList<object> fruitList = new MyList<object>();
Run Code Online (Sandbox Code Playgroud)
然后一切都恢复正常.究竟我做错了什么?
非常感谢答案,感谢您花时间阅读,即使没有回答.
你正在尝试使用协方差.
.Net仅支持接口上的泛型差异,因此不起作用.
此外,协方差仅对不可变类型有意义.
如果可以将a转换MyList<Apple>为a MyList<Fruit>,那么您就可以Orange在列表中添加一个违反类型安全的内容.
相反,您可以使方法通用:
public void Add<U>(IList<U> list) where U : T
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
293 次 |
| 最近记录: |