[英]What is the difference between Cast List<object> and Cast IEnumerable<object>
我试图从对象(该对象包含List<Apple>
)转换为List<object>
,但它失败并出现异常:
无法将类型为“System.Collections.Generic.List [list_cast_object_test.Apple]”的对象强制转换为“System.Collections.Generic.List [System.Object]”。
当我用IEnumerable
或IList
(一个接口)替换List
,它运行良好,我不明白它的区别....
代码如下:
private void Form1_Load(object sender, EventArgs e) {
object resultObject = GetListAsObject();
// this cast works fine, it's normal...
var resAsIt = (List<Apple>)resultObject;
// also when I use a generic interface of 'object' cast works fine
var resAsIEnumerable = (IEnumerable<object>)resultObject;
// but when I use a generic class of 'object' it throws me error: InvalidCastException
var resAsList = (List<object>)resultObject;
}
private object GetListAsObject() {
List<Apple> mere = new List<Apple>();
mere.Add(new Apple { Denumire = "ionatan", Culoare = "rosu" });
mere.Add(new Apple { Denumire = "idared", Culoare = "verde" });
return (object)mere;
}
}
public class Apple {
public string Denumire { get; set; }
public string Culoare { get; set; }
}
有人可以解释一下它发生了什么? 强制转换为通用接口和强制转换为泛型类有什么区别?
这是因为在IEnumerable<T>
T
是协变的,而在List<T>
T
中不支持协方差。
在c#中查看有关Covariance和Contraviance的更多信息
如果你想做那样的事情,你必须使用ToList<T>()
重载,它将它包装到对象类型,如:
List<object> result = resultObject.ToList<object>();
由于新的List<T>
创建,我们能够将List<Apple>
转换为List<Object>
,其中T
是Object
类型但我们不能将原始的List<Apple>
引用转换为List<object>
。
在这种情况下,它会创建的实例Object
类型以及将存储参考你的类型为类型的参考object
,但值类型或strcuts的情况下,将有拳击成本。
IEnumerable<T>
是一个接口,由于类型T
被定义为协变(它实际上是IEnumerable<out T>
,请注意out
),你可以将T
转换为基本实现,因此IEnumerable<object
是一个有效的强制转换您的List<Apple>
类型List<Apple>
。
但是,类型List<Apple>
不等于List<object>
类型,列表List<Apple>
也不是从List<object>
派生的。 List<T>
上的类型参数不是协变的,因此强制转换是无效的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.