IEnumerable.ToArray <t>()与IEnumerable.Cast <t>()。ToArray()</t> </t>

时间:2010-11-10 17:42:43

标签: c# .net 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();
}

1 个答案:

答案 0 :(得分:7)

ToArray<T>()是通用的原因是它可以在任何 IEnumerable<T>上运行,而不是让您可以提供不同的T

public static T[] ToArray<T>(this IEnumerable<T> self) { ... }

您永远不需要自己提供T。如果你这样做,就像在你的例子中一样,该方法可能会收到一个你没有提供的IEnumerable<IFoo>

仅供参考,没有“非泛型ToArray()”。编译器根据您调用ToArray()的可枚举类型推断T泛型参数。