C# 转换列表<&燃气轮机;到一个数组-我得到;试图以与数组不兼容的类型访问元素。”;

C# 转换列表<&燃气轮机;到一个数组-我得到;试图以与数组不兼容的类型访问元素。”;,c#,.net,C#,.net,我试图遍历一组项目,每个项目都有一个列表对象数组,我想将其转换为一个数组。。下面是执行此操作的代码: foreach (IngredientNode i in _snapshot._ingredientMap.Values) { for (int c = 0; c < NUM_TAGS; c++) { if (i.RecipesByTag[c] == null) continue; i.RecipesByTag[c] = i.RecipesByTag[c

我试图遍历一组项目,每个项目都有一个列表对象数组,我想将其转换为一个数组。。下面是执行此操作的代码:

foreach (IngredientNode i in _snapshot._ingredientMap.Values)
{
   for (int c = 0; c < NUM_TAGS; c++)
   {
      if (i.RecipesByTag[c] == null) continue;
      i.RecipesByTag[c] = i.RecipesByTag[c].ToArray<RecipeNode>();
   } <--- EXCEPTION
}
foreach(快照中的IngredientNode i.\u ingredientMap.Values)
{
对于(int c=0;c}您不必为
ToArray
方法指定类型参数,如果您使用的是强类型集合,则应根据其用法推断该参数。这是一个泛型类型转换问题。您正在尝试将元素放入某个不兼容类型的数组中

您的问题应该归结到这一点(这些数组是协变的):

现在,同样的事情,对于不同的类型(这些数组也是协变的):

IEnumerable[]x=新列表[1];
x[0]=new int[1];//编译良好,产生运行时错误
类型系统不喜欢这样的原因应该很明显。基本上,您将其视为一个
IEnumerable
数组,但实际上它是一个
List
数组。您不能将一个不相关的int类型数组放入该数组中


我相信Eric Lippert在他的书中对此解释得很好。

好的,我想我知道发生了什么。。我有一个枚举数组。起初,这是一个指向列表对象的指针数组。我改为将它作为一个其他数组的数组,换句话说,我将我的数组转换为多维数组。因为多维数组是在内存中连续(与指向其他数组的指针数组相反),这样做完全破坏了内存中的数组。至少这是我的理论

我所做的是从头开始完全重新创建I.Recipes ByTag。类似于:

List<RecipeNode[]> temp = new List<RecipeNode[]>();

for (int c = 0; c < NUM_TAGS; c++)
{
   RecipeNode[] nodes = (i.RecipesByTag[c] == null) ? null : i.RecipesByTag[c].ToArray<RecipeNode>();
   temp.Add(nodes);
}

i.RecipesByTag = temp.ToArray();
List temp=new List();
对于(int c=0;c

这非常有效。

.NET Runtime 2.0,C#3.5编译器..顺便说一句,以上操作将导致相同的错误。据我所知,这是一个运行时错误,错误限制。如果您有一个可枚举数组,则无法将该数组中的一个元素设置为另一个数组。编译器允许这样做,因为数组是可枚举类型,所以静态类型匹配。但是,当数组自动变为多维时,宇宙内爆,整个内存结构损坏。运行时不够聪明,无法移动内存中的所有内容。我找到了解决方法,我将发布答案。这不是运行时错误。这是应用于数组的协变类型规则。你可以n实际使用数组时,不会出现编译器错误,而是运行时错误。我从来没有说过这是一个错误,我说的是限制:)一旦我考虑数组在内存中的实际布局,这就很有意义。但是,它确实显示了编译器的工作原理。当我说foo[5]=someArray,则它期望foo是一个多维数组。仅仅将foo[5]作为指向堆上某个位置的另一个数组的指针是不够聪明的。很好,“据我所知,这是一个运行时错误,错误限制。”我认为这是一个错误,但甚至没有注意到错误限制部分。问题不在于内存分配,而在于运行时如何解释类型信息。我更新了答案以反映这一点。如果您愿意,您应该能够创建一个独立的测试用例。
IEnumerable<int>[] x = new List<int>[1];
x[0] = new int[1]; // compiles fine, yields runtime error
List<RecipeNode[]> temp = new List<RecipeNode[]>();

for (int c = 0; c < NUM_TAGS; c++)
{
   RecipeNode[] nodes = (i.RecipesByTag[c] == null) ? null : i.RecipesByTag[c].ToArray<RecipeNode>();
   temp.Add(nodes);
}

i.RecipesByTag = temp.ToArray();