IEnumerable.ToArray <T>()与IEnumerable.Cast <T>().ToArray()

Ste*_*ven 4 .net c# linq

当试图从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)

cdh*_*wie 7

原因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()的可枚举类型推断泛型参数.