【发布时间】:2016-02-03 12:45:18
【问题描述】:
我尝试将对象(对象包含List<Apple>)转换为List<object>,但失败并出现异常:
无法将“System.Collections.Generic.List[list_cast_object_test.Apple]”类型的对象转换为“System.Collections.Generic.List[System.Object]”类型。
当我将List 替换为IEnumerable 或IList(一个接口)时,它运行良好,但我不明白其中的区别......
代码如下:
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>是协变的 -
这是lion eats giraffe 的问题。
IEnumerable<>对长颈鹿来说是安全的,因为你不能 add lions。
标签: c# class generics interface casting