LINQ返回一个接口

本文关键字:一个 接口 返回 LINQ | 更新日期: 2023-09-27 18:06:34

只是浏览了一下MSDN上的LINQ教程,遇到了以下代码:

IEnumerable<int> numQuery1 = 
            from num in numbers
            where num % 2 == 0
            orderby num
            select num;

我不明白接口是如何返回的?这是我的理解,接口只是一个类的轮廓,当然不能包含任何数据。

我希望这能被澄清

LINQ返回一个接口

接口是关于返回值的契约:Linq实际上不会告诉你它将返回什么(就像在实际的类中一样),但它会保证它的行为像IEnumerable<int>,也就是说,它返回的类实现了这个接口。它可以是List<int>WhackyLinqInternalEnumerable<int> -但你并不真正关心,因为,你感兴趣的是接口(你可以用这个对象做什么)。

变量和它所代表的对象之间的区别可能会使您感到困惑:对于(引用)类型,变量只是"指向"对象。你可以有很多变量"指向"同一个对象。它们不需要具有相同的类型,但它们都指向的对象必须与变量具有相同的类型,或者是子类型,或者(在具有接口类型的变量的情况下)必须实现相同的变量。

你得到了一个接口的实现,但是通过接口来处理它——你不知道具体的Type。

http://en.wikipedia.org/wiki/Interface_(计算)

但是你可以创建interface类型的对象…不要混淆类类型和接口类型

下面是如何创建接口类型的例子:同样的事情发生在上面的
interface IA 
{
   void methodA();
}
Class B : IA
{
}
Class C
{
   IA a = new B();
}
public interface IMyInterface {
}
public class MyCoolInterfaceImplementation : IMyInterface  {
}
//somewhere in code 
IMyInterface inter = new MyCoolInterfaceImplementation (); 

这是完全有效的代码。您提供的代码中也有相同的思想。

它的意思是linq查询返回满足这个接口的类的实例。作为调用者,您不需要知道实际的类是什么,只需知道它满足指定的接口即可。

如果一个方法返回一个接口,当然它必须返回一个实际的对象,一个实现了特定接口的类。

这通常被认为是方法与调用者之间的"契约"。这个方法说"我将总是返回具有这种特定行为的东西"。

在这种特殊情况下,LINQ查询代码必须返回实现IEnumerable<int>接口的任何对象。

换句话说,如果你这样做:

Debug.WriteLine(numQuery1.GetType().FullName);

你会看到实际的类型被返回。

下面的例子:

var numbers = new[] { 1, 2, 3, 4 };
IEnumerable<int> numQuery1 = 
        from num in numbers
        where num % 2 == 0
        orderby num
        select num;
Debug.WriteLine(numQuery1.GetType().FullName);

将在。net 4.0中输出:

System.Linq.OrderedEnumerable 2[[系统。Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System. int]Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]

表示这是System.Linq.OrderedEnumerable<int, int>

然而,这是真正的重点,你不应该太在意。您只需要知道LINQ查询返回实现该接口的。在未来的。net版本中,代码实际上可能返回其他东西,但仍然是实现IEnumerable<T>的对象。

想象一下:现在是5点,你想回家。在这一点上,您将如何到达那里真的无关紧要:(抽象地说)您可以实例化类Car或类Bike甚至类Tank。但说实话,你在乎吗?只要取一个实现IVehicle的实例,然后返回