C# 列表<;字符串>;反对[]

C# 列表<;字符串>;反对[],c#,C#,我有一个方法返回一个列表,我试图将其传递给组合框的AddRange(Object[])方法 如何将我的列表转换为对象[] 我想我可以使用foreach,但我更愿意使用AddRange(Object[]),因为它更快(并且生成的代码更少) 编辑 以下工作很好: var list = new List<string>(); object[] array = list.ToArray<object>(); comboBox.AddRange(array); var list=

我有一个方法返回一个
列表
,我试图将其传递给
组合框的
AddRange(Object[])
方法

如何将我的
列表
转换为
对象[]

我想我可以使用
foreach
,但我更愿意使用
AddRange(Object[])
,因为它更快(并且生成的代码更少)

编辑

以下工作很好:

var list = new List<string>();
object[] array = list.ToArray<object>();
comboBox.AddRange(array);
var list=newlist();
object[]数组=list.ToArray();
comboBox.AddRange(数组);
但是,另一方面,我想执行上述操作而不是:

var list = new list<string>();
comboBox.AddRange(list.ToArray<object>());
var list=newlist();
comboBox.AddRange(list.ToArray());

您可以使用类似的方式来明确说明类型的更改:

object[] array = yourList.Cast<Object>().ToArray();
列表项=。。。;
cb.Items.AddRange(Items.ToArray());
也许这样可以:

object[] myArray = myList.OfType<object>().ToArray();
object[]myArray=myList.OfType().ToArray();

您可以使用
ToArray
通用方法:

var list = new List<string>();
object[] array = list.ToArray<object>();
var list=newlist();
object[]数组=list.ToArray();

您甚至不需要使用
Cast
,因为
ToArray
接受
IEnumerable
,这在泛型类型参数上是协变的。

引用数组与它们的基类数组(以及它们的接口数组和其他数组)是协变的(),因此您可以:

AddRange(mystrings.ToArray());
mystrings.ToArray()
是一个
字符串[]
,它与
对象[]
是协变的(因此
AddRange
将接受它)

对于任意两种引用类型A和B,如果存在从A到B的隐式引用转换(第6.1.4节)或显式引用转换(第6.2.3节),则从阵列类型A[R]到阵列类型B[R]也存在相同的引用转换


如果是为了方便:

public static class ObjectCollectionExtension
{
    public static void AddAll<T>(this ComboBox.ObjectCollection self, IEnumerable<T> es)
    {
        foreach (var e in es)
            self.Add(e);
    }
}
公共静态类ObjectCollectionExtension
{
公共静态void AddAll(此ComboBox.ObjectCollection自身,IEnumerable es)
{
foreach(es中的变量e)
添加(e);
}
}

可能是泛型弄错了,我有点生疏。

这里唯一的解决方案是不要忘记数组在C#中已经是协变的。这会产生
从字符串[]到对象[]的协变数组转换会导致写操作的运行时异常
,这就是我偏离它的原因。数组也是协变的,因此,您甚至不需要执行
list.ToArray()
,只需执行
list.ToArray()
@MagnusGrindalBakken:这取决于OP以后是否希望在同一数组中存储非字符串。@MagnusGrindalBakken在调用
AddRange
等方法时,您可以利用这一点,但是,如果您以后想使用该数组,我建议您使用
ToArray
而不是数组协方差。@MagnusGrindalBakken刚刚执行
list.ToArray()
会生成一条警告,说明
从字符串[]到对象[]的协变数组转换可能导致写入操作时出现运行时异常
@cogumel0您引用的警告与Jon Skeet在上面几句评论中指出的相同。
AddRange(mystrings.ToArray());
public static class ObjectCollectionExtension
{
    public static void AddAll<T>(this ComboBox.ObjectCollection self, IEnumerable<T> es)
    {
        foreach (var e in es)
            self.Add(e);
    }
}