繁体   English   中英

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

[英]IEnumerable.ToArray<T>() vs. IEnumerable.Cast<T>().ToArray()

当尝试从IEnumerable对象集合中获取对象数组(与我想要的数组进行广播时不同)时,我知道我可以先将源集合转换为适当的类型,然后从中获取一个数组,但是使用ToArray<T>()方法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();
}

ToArray<T>()之所以通用,是因为它可以在任何 IEnumerable<T> ,而不是可以提供不同的T

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

您永远不需要自己提供T 如果您这样做了(如您的示例所示),则该方法将期望接收到例如IEnumerable<IFoo> ,而您没有提供该方法。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM