LINQ返回一个接口?

时间:2011-08-25 13:35:40

标签: c# linq interface

只需查看LINQ tutorials on MSDN,即可查看以下代码:

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

我不明白界面是如何被退回的?我的理解是,界面只是一个类的轮廓,当然不能包含任何数据。

我希望这能得到澄清。

7 个答案:

答案 0 :(得分:10)

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

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

答案 1 :(得分:6)

你得到了一个接口的实现,但通过接口使用它 - 你不知道具体的类型。

http://en.wikipedia.org/wiki/Interface_(computing)

答案 2 :(得分:0)

但是你可以创建类型接口的对象...它可能不会在类类型和接口类型之间混淆

下面是一个示例:如何创建接口类型:在上面的情况下发生同样的事情

interface IA 
{
   void methodA();
}

Class B : IA
{

}

Class C
{
   IA a = new B();
}

答案 3 :(得分:0)

public interface IMyInterface {
}

public class MyCoolInterfaceImplementation : IMyInterface  {
}

//somewhere in code 

IMyInterface inter = new MyCoolInterfaceImplementation (); 

这是完全有效的代码。您提供的代码也是如此。

答案 4 :(得分:0)

这意味着linq查询返回满足此接口的类的实例。您,调用者,不需要知道实际的类是什么,只需要它满足指定的接口。

答案 5 :(得分:0)

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

这通常被视为该方法与调用者的“契约”。该方法说“我将永远返回具有这种特殊行为的东西”。

在这种特殊情况下,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 [[System.Int32,mscorlib,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089],[System.Int32,mscorlib,Version = 4.0.0.0,Culture = neutral,公钥= b77a5c561934e089]]

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

然而,这才是真正的一点,你不应该在乎这么多。您需要知道的是LINQ查询返回实现此接口的某些。在未来的.NET版本中,代码实际上可能会返回其他内容,但仍然是实现IEnumerable<T>的对象。

答案 6 :(得分:0)

想想这样:现在是5点,你想回家。在这一点上,你怎么去到那里真的没关系:(抽象地说)你可以实例化课程汽车或课程自行车甚至是坦克课程即可。但老实说,你关心吗?你只需要一个实例 IVehicle 的实例,然后回家。