当尝试从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();
}
答案 0 :(得分:7)
ToArray<T>()
是通用的原因是它可以在任何 IEnumerable<T>
上运行,而不是让您可以提供不同的T
:
public static T[] ToArray<T>(this IEnumerable<T> self) { ... }
您永远不需要自己提供T
。如果你这样做,就像在你的例子中一样,该方法可能会收到一个你没有提供的IEnumerable<IFoo>
。
仅供参考,没有“非泛型ToArray()”。编译器根据您调用ToArray()的可枚举类型推断T
泛型参数。