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

use*_*923 1 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));
Run Code Online (Sandbox Code Playgroud)

这不会编译说:

方法void System.Array.ForEach(T [],Action)的类型参数无法从用法中推断出来.

怎么可能?

SWe*_*eko 5

CustomArray类型是不是一个数组,它是一个自定义类型与索引属性.

ForEach<T>方法需要一个包含类型元素的数组T,但它没有得到一个.

仅仅因为你可以[]在数组和索引属性上使用相同的operator(),并不意味着它们是同一个东西.例如,阵列由本质上是顺序的,也就是说如果a[0]a[2]存在,这暗示存在a[1].另一方面,索引属性更像是获取参数的方法,并且无论他们想要什么,他们都可以自由地使用它.


如果要声明一个MyType对象数组,则不需要执行任何特殊声明,您可以这样做:

var arr = new MyType[10];
Run Code Online (Sandbox Code Playgroud)

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

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

intList.AddRange(arr.Select(x=> x.MyProperty));
Run Code Online (Sandbox Code Playgroud)