Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C#中,为什么可以';t列表<;字符串>;对象存储在列表中<;对象>;变量_C#_.net_Generics_Covariance_Type Safety - Fatal编程技术网

在C#中,为什么可以';t列表<;字符串>;对象存储在列表中<;对象>;变量

在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>

似乎列表对象不能存储在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> 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);