当试图从IEnumerable对象集合中获取对象数组时(与我想要的数组不同),我知道我可以先将源集合转换为正确的类型,然后从中获取一个数组,但是方法ToArray<T>()给出了我认为它可以一步完成这两项操作.但是,从我的经验来看,我从来没有找到过这种ToArray<T>()方法适用于任何T 的情况,除了原始来源的T(在我看来,这是ToArray<T>()愚蠢的,因为它与非泛型ToArray做同样的事情))已经).
所以我的问题是,我是否错过了该ToArray<T>()方法的重点,并且我试图让它做一些它从未打算过的事情,或者是否有一些愚蠢的我在方法方面缺少什么,以及我是什么试图做的事情一般都遵循其意图吗?
这是一个具体的例子来说明我的问题:
public interface IFoo { }
public class Foo : IFoo { }
static void Main(string[] args)
{
// Suppose a list of Foos was created
List<Foo> src = new List<Foo>();
// I would be safe obtaining an array of IFoos from that list, but
// This is not supported (although intellisense shows the method is there, the compiler balks):
// IFoo[] results = src.ToArray<IFoo>();
// Whereas this works just fine:
IFoo[] results = src.Cast<IFoo>().ToArray();
}
Run Code Online (Sandbox Code Playgroud)
原因ToArray<T>()是通用的,它可以在任何 操作IEnumerable<T>,而不是你可以提供不同的T:
public static T[] ToArray<T>(this IEnumerable<T> self) { ... }
Run Code Online (Sandbox Code Playgroud)
你永远不需要提供T自己.如果你这样做,就像在你的例子中一样,该方法会期望接收,例如,IEnumerable<IFoo>你没有提供的.
仅供参考,没有"非通用的ToArray()".编译器T根据您调用ToArray()的可枚举类型推断泛型参数.