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