Array.ForEach无法根据用法推断数组元素类型

时间:2013-09-11 12:45:53

标签: c# arrays lambda

public class MyType
{
    public int SomeProperty { get; set; }
}

public class CustomArray
{
    public MyType this[int index]
    {
        //some code
    }
}

var intList = new List<int>();
var arr = new CustomArray();
Array.ForEach(arr, x => intList.Add(x.MyProperty));

这不会编译说:

  

方法void System.Array.ForEach(T []的类型参数,   无法从使用中推断出行动。

怎么可能?

1 个答案:

答案 0 :(得分:5)

CustomArray类型不是数组,它是具有索引属性的自定义类型。

ForEach<T>方法需要一个类型为T的数组,但它没有得到一个。

仅仅因为你可以在数组和索引属性上使用相同的运算符([]),并不意味着它们是相同的。例如,数组本质上是连续的,这意味着如果存在a[0]a[2],则意味着存在a[1]。另一方面,索引属性更像是获取参数的方法,并且可以随意使用它。


如果你想声明一个MyType个对象的数组,你不需要做任何特殊的声明,你可以这样做:

var arr = new MyType[10];

现在你有一个可容纳10个MyType个对象的数组。最初,任何数组插槽中的值都是null(假设MyType是一个类)。

另外我会避开Array.ForEach方法,我更喜欢使用简单的for或foreach循环,或者在这种特殊情况下,可能使用List.AddRange方法:

intList.AddRange(arr.Select(x=> x.MyProperty));