Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# IEnumerable.ToArray<;T>;()对IEnumerable.Cast<;T>;()ToArray()_C#_.net_Linq - Fatal编程技术网

C# IEnumerable.ToArray<;T>;()对IEnumerable.Cast<;T>;()ToArray()

C# IEnumerable.ToArray<;T>;()对IEnumerable.Cast<;T>;()ToArray(),c#,.net,linq,C#,.net,Linq,当尝试从IEnumerable对象集合中获取对象数组(强制转换方式与我想要的数组不同)时,我知道我可以首先将源集合强制转换为适当的类型,然后从中获取数组,但是方法ToArray()给我的印象是,它可以在一个步骤中处理这两个操作。然而,根据我的经验,我从来没有发现过这样一种情况,即ToArray()方法适用于除原始源代码的T之外的任何T(在我看来,这使得ToArray()愚蠢,因为它做的事情与非泛型ToArray()已经做的事情相同) 所以我的问题是,我是否错过了ToArray()方法的要点,并且

当尝试从IEnumerable对象集合中获取对象数组(强制转换方式与我想要的数组不同)时,我知道我可以首先将源集合强制转换为适当的类型,然后从中获取数组,但是方法
ToArray()
给我的印象是,它可以在一个步骤中处理这两个操作。然而,根据我的经验,我从来没有发现过这样一种情况,即
ToArray()
方法适用于除原始源代码的T之外的任何T(在我看来,这使得
ToArray()
愚蠢,因为它做的事情与非泛型ToArray()已经做的事情相同)

所以我的问题是,我是否错过了
ToArray()
方法的要点,并且我试图让它做一些它从来没有打算做的事情,或者我在这个方法上遗漏了一些愚蠢的事情,而我尝试做的事情通常都遵循了它的意图

下面是一个具体的例子来说明我的问题:

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();
}
公共接口IFoo{}
公共类Foo:IFoo{}
静态void Main(字符串[]参数)
{
//假设创建了一个foo列表
List src=新列表();
//我可以安全地从列表中获取一系列IFoos,但是
//这不受支持(尽管intellisense显示该方法存在,但编译器会犹豫):
//IFoo[]results=src.ToArray();
//然而,这很好:
IFoo[]results=src.Cast().ToArray();
}
ToArray()之所以是泛型的,是因为它可以对任何
IEnumerable
进行操作,而不是因为您可以提供不同的
T

public static T[] ToArray<T>(this IEnumerable<T> self) { ... }
publicstatict[]ToArray(这个IEnumerable self){…}
您不需要自己提供
T
。如果您这样做了,例如在您的示例中,该方法将期望收到您没有提供的
IEnumerable


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

这很有意义。看起来我把ToArray()和ToArray()搞混了。我假设这是两种不同的方法,但看起来ToArray()实际上只是重定向到基于源IEnumerable的T的ToArray()的隐式解释。也许是个人偏见,但我还是觉得这有点尴尬。也许这就是泛型的本质。我认为有一种方法可以“隐藏”通用的T,但我真的想不出一个好的方法,因为(正如你提到的)IEnumerable需要一个T。无论如何,谢谢你的回答。没问题。是的,你是对的——它们是相同的方法。如果调用泛型方法并且不提供任何类型参数,编译器将尝试为您推断它们。这听起来很尴尬,但可以节省很多打字时间。想象一下,如果您有一个列表--.ToArray()比.ToArray()好得多。(作为旁注,如果存在非泛型方法,并且您的参数与其签名兼容,编译器将更喜欢非泛型方法,否则它将寻找可用的泛型重载。)是否可以在C#4中使用不同的
T
,因为
IEnumerable
中的
T
是协变的?