只需查看LINQ tutorials on MSDN,即可查看以下代码:
IEnumerable<int> numQuery1 =
from num in numbers
where num % 2 == 0
orderby num
select num;
我不明白界面是如何被退回的?我的理解是,界面只是一个类的轮廓,当然不能包含任何数据。
我希望这能得到澄清。
答案 0 :(得分:10)
接口是返回值的合约:Linq实际上不会告诉你它将返回什么(就像在实际的类中一样),但它会保证它的行为类似于IEnumerable<int>
,也就是说,它返回的类实现了这个接口。它可能是List<int>
或WhackyLinqInternalEnumerable<int>
- 但您并不在乎,因为,您感兴趣的只是界面(您可以做什么)与对象)。
可能让您感到困惑的一件事是变量与它所代表的对象之间的区别:对于(引用)类型,变量只是“指向”对象。你可以让很多变量“指向”同一个对象。它们不需要具有相同的类型,但它们所指向的对象必须是与变量相同的类型,子类型或(在具有接口类型的变量的情况下)必须实现相同的变量。
答案 1 :(得分:6)
你得到了一个接口的实现,但通过接口使用它 - 你不知道具体的类型。
答案 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 的实例,然后回家。