C#:泛型内没有投射?

Fel*_*ala 4 c# generics casting

虽然我可以将一个字符串向上转换为一个对象,但是我无法将IList字符串向上转换为IList对象.怎么会?现在该怎么做才能将所有项目都复制到一个新的IList?

static void ThisWorks()
{
     IList<object> list = new List<object>();
     list.Add("I can add a string since string : object");
}

static void ThisDoesNotWork()
{
     // throws an invalid cast exception
     IList<object> list = (IList<object>) new List<string>(); 

     list.Add("I'm never getting here ... why?");
}
Run Code Online (Sandbox Code Playgroud)

Meh*_*ari 7

这是不可能的,因为泛型是不变的(从C#3.0开始).

您可以使用以下方法解决此问题

var objectList = list.Cast<object>().ToList();
Run Code Online (Sandbox Code Playgroud)


Pon*_*gge 4

这样看:虽然香蕉是一种水果,但一篮子香蕉不是一篮子水果,因为你可以在后者中添加橙子,但不能在前者中添加橙子。你的List<string>约束比List<object>.

选角应该始终尊重Liskow。对于不允许修改的容器和迭代器,这种类型转换是安全的,但是一旦事情可以改变,你就如履薄冰了。