在C#中,为什么可以';t列表<;字符串>;对象存储在列表中<;对象>;变量
似乎列表对象不能存储在C#中的列表变量中,甚至不能以这种方式显式转换在C#中,为什么可以';t列表<;字符串>;对象存储在列表中<;对象>;变量,c#,.net,generics,covariance,type-safety,C#,.net,Generics,Covariance,Type Safety,似乎列表对象不能存储在C#中的列表变量中,甚至不能以这种方式显式转换 List<string> sl = new List<string>(); List<object> ol; ol = sl; List sl=newlist(); 列表ol; ol=sl; 中的结果无法将类型System.Collections.Generic.List隐式转换为System.Collections.Generic.List 然后 List<string>
List<string> sl = new List<string>();
List<object> ol;
ol = sl;
List sl=newlist();
列表ol;
ol=sl;
中的结果无法将类型System.Collections.Generic.List
隐式转换为System.Collections.Generic.List
然后
List<string> sl = new List<string>();
List<object> ol;
ol = (List<object>)sl;
List sl=newlist();
列表ol;
ol=(列表)sl;
中的结果无法将类型System.Collections.Generic.List
转换为System.Collections.Generic.List
当然,您可以通过将所有内容从字符串列表中提取出来,然后一次将其放回一个字符串列表中来实现,但这是一个相当复杂的解决方案。原因是像
list
这样的泛型类在大多数情况下被外部视为普通类。e、 当你说List()
时,编译器说ListString()
(包含字符串)。[技术民谣:这是一个非常简单的英语版本的事情发生了]
因此,很明显,编译器不能足够聪明地通过强制转换ListString内部集合的项将其转换为ListObject
这就是为什么像Convert()这样的IEnumerable有一些扩展方法,允许您轻松地为存储在集合中的项提供转换,这可以像从一个转换到另一个一样简单。原因是像
List
这样的泛型类在大多数情况下在外部被视为普通类。e、 当你说List()
时,编译器说ListString()
(包含字符串)。[技术民谣:这是一个非常简单的英语版本的事情发生了]
因此,很明显,编译器不能足够聪明地通过强制转换ListString内部集合的项将其转换为ListObject
这就是为什么像Convert()这样的IEnumerable有一些扩展方法,允许您轻松地为存储在集合中的项提供转换,这可能很简单,就像从一个转换到另一个一样。如果要执行这种转换,请这样想,然后将Foo类型的对象添加到列表中,字符串列表不再一致。如果您要迭代第一个引用,您将得到一个类强制转换异常,因为一旦您命中Foo实例,Foo就无法转换为string 作为旁注,我认为更重要的是你是否可以做反向演员:
List<object> ol = new List<object>();
List<string> sl;
sl = (List<string>)ol;
List ol=new List();
列表sl;
sl=(列表)ol;
我已经有一段时间没有使用C#了,所以我不知道这是否合法,但这种类型的强制转换实际上(可能)是有用的。在本例中,您将从一个更一般的类(对象)扩展到一个从一般类扩展而来的更具体的类(字符串)。这样,如果添加到字符串列表中,就不会违反对象列表
有人知道或者可以测试这样的强制转换在C#中是否合法吗?这样想,如果你进行这样的强制转换,然后将Foo类型的对象添加到列表中,字符串列表就不再一致了。如果您要迭代第一个引用,您将得到一个类强制转换异常,因为一旦您命中Foo实例,Foo就无法转换为string 作为旁注,我认为更重要的是你是否可以做反向演员:
List<object> ol = new List<object>();
List<string> sl;
sl = (List<string>)ol;
List ol=new List();
列表sl;
sl=(列表)ol;
我已经有一段时间没有使用C#了,所以我不知道这是否合法,但这种类型的强制转换实际上(可能)是有用的。在本例中,您将从一个更一般的类(对象)扩展到一个从一般类扩展而来的更具体的类(字符串)。这样,如果添加到字符串列表中,就不会违反对象列表
有人知道或者可以测试这样的演员阵容在C#中是否合法吗?迈克-我相信C#中也不允许出现相反的情况
有关更多信息,请参阅。迈克-我认为C#中也不允许使用逆变
有关更多信息,请参阅。这与协方差有很大关系,例如,泛型类型被视为参数,如果参数不能正确解析为更具体的类型,则操作失败。这样做的含义是,您确实无法强制转换为更一般的类型,如对象。正如Rex所说,List对象不会为您转换每个对象 您可能希望尝试ff代码:
List<string> sl = new List<string>();
//populate sl
List<object> ol = new List<object>(sl);
List sl=newlist();
//填充sl
列表ol=新列表(sl);
或:
List ol=new List();
ol.AddRange(sl);
ol将(理论上)毫无问题地复制sl的所有内容。这与协方差有很大关系,例如,泛型类型被视为参数,如果参数不能正确解析为更具体的类型,则操作失败。这样做的含义是,您确实无法强制转换为更一般的类型,如对象。正如Rex所说,List对象不会为您转换每个对象 您可能希望尝试ff代码:
List<string> sl = new List<string>();
//populate sl
List<object> ol = new List<object>(sl);
List sl=newlist();
//填充sl
列表ol=新列表(sl);
或:
List ol=new List();
ol.AddRange(sl);
ol将(理论上)毫无问题地复制sl的所有内容。如果您使用的是.NET 3.5,请查看Enumerable.Cast方法。它是一个扩展方法,因此您可以直接在列表中调用它
List<string> sl = new List<string>();
IEnumerable<object> ol;
ol = sl.Cast<object>();
List sl=newlist();
IEnumerable-ol;
ol=sl.Cast();
这不完全是你要求的,但应该做到
编辑:正如Zooba所指出的,如果您使用的是.NET 3.5,那么您可以调用ol.ToList()来获取一个列表。请查看Enumerable.Cast方法。它是一个扩展方法,因此您可以直接在列表中调用它
List<string> sl = new List<string>();
IEnumerable<object> ol;
ol = sl.Cast<object>();
List sl=newlist();
IEnumerable-ol;
ol=sl.Cast();
这不完全是你要求的,但你应该这样做
object[] a = new string[] {"spam", "eggs"};
List<string> sl = new List<string>();
List<object> ol = sl.Cast<object>().ToList();
public IList<B> ConvertIList<D, B>(IList<D> list) where D : B
{
List<B> newList = new List<B>();
foreach (D item in list)
{
newList.Add(item);
}
return newList;
}
private List<Leerling> Leerlingen = new List<Leerling>();
Leerlingen = (List<Leerling>)_DeserialiseerLeerlingen._TeSerialiserenObjecten.Cast<Leerling>();
IEnumerable<object> ob;
List<string> st = new List<string>();
ob = st.Cast<object>();
List<string> st = new List<string>();
List<object> ob = st.Cast<object>().ToList();
List<string> sl = new List<string>();
List<object> ol;
ol = new List<object>(sl);