C#多态性简单问题

ibi*_*iza 9 c# polymorphism

我得到了一个X类和一个Y类,后者派生自X:

class x {}
class y : x {}
Run Code Online (Sandbox Code Playgroud)

然后在某处我使用X列表:

List<X> lstX;
...
Run Code Online (Sandbox Code Playgroud)

然后我想从我的其他列表中的数据中使用一个新的Y列表......沿着这些方向:

List<Y> lstY = lstX;
Run Code Online (Sandbox Code Playgroud)

我相信X列表中的项目会自动转换为Y,但事实并非如此.

另外,我如何从某个X初始化Y的新实例?我想要做 :

var newX = new X();
var newY = new Y(X);
Run Code Online (Sandbox Code Playgroud)

但它似乎并没有像那样工作.

谢谢你的帮助!抱歉格式化,尽我所能

Eri*_*ert 27

这里有几个问题.

首先:"我可以将Tiger类型的对象分配给Animal类型的变量.为什么我不能将List of Tiger类型的对象分配给List of Animal类型的变量?"

因为这会发生:

List<Tiger> tigers = new List<Tiger>();
List<Animal> animals = tigers; // this is illegal because if we allow it...
animals.Add(new Giraffe()); // ... then you just put a giraffe into a list of tigers.
Run Code Online (Sandbox Code Playgroud)

在C#4中,这样做是合法的:

IEnumerable<Tiger> tigers = new List<Tiger>();
IEnumerable<Animal> animals = tigers;
Run Code Online (Sandbox Code Playgroud)

这是合法的,因为IEnumerable<T>没有"添加"方法,因此保证这是安全的.

有关协方差的一系列文章,请参阅有关C#4这一新功能的详细信息.

http://blogs.msdn.com/ericlippert/archive/tags/Covariance+and+Contravariance/default.aspx

第二个问题:"我怎么能从某个动物身上初始化一个新的Tiger实例?"

你不能.有问题的动物可能是瓢虫.你是如何从瓢虫的实例初始化一只新老虎的?这没有任何意义,所以我们不允许你这样做.如果你想编写自己的特殊方法,知道如何将任意动物变成老虎,你可以自由地这样做.但是我们不知道如何为你做这件事.

  • @ibiza:那么,继续这个逻辑吧.假设它按照你的方式工作.现在你拿出原始的老虎名单并列举它:foreach(老虎虎虎) - 当你在列表中遇到长颈鹿时会发生什么?请注意,这些转化是*参考*转化.你没有制作新的动物清单; 相反,你有两个对同一个列表的引用. (2认同)