2012-06-22 34 views
4

我有这样的代码:VAR如何确定对多种选择?

IEnumerable<string> q = customers /*EF entity*/ 
.Select (c => c.Name.ToUpper()) 
.OrderBy (n => n) 

要选择实体,ObjectContext的实际创建的ObjectQuery,这 实现IQueryable的。从的ObjectQuery对象的回报,是不是 普通对象,但EntityObject

,但如果我写:(注意var

var q = customers /*EF entity*/ 
.Select (c => c.Name.ToUpper()) 
.OrderBy (n => n) 

可以确定既ienumerableiqueryable

因为ObjectQuery另外实施IEnumerable ...

我不知道是否有任何具体的信息,告诉编译器“使用的,而不是B.一个更具体的...”(必须有...我只是不能找到它)

enter image description here

有帮助吗?它将如何知道使用A || B?

+0

一种简单的方法可以告诉Type var在Visual Studio中使用的是将鼠标悬停在var关键字上,并且弹出窗口会告诉您它是什么类型。 C#深入介绍了C#中类型推理的工作原理。 –

+0

@EricAndres我有resharper哪些做了更好的工作:)...我只是想了解如何作出决定:)感谢人 –

回答

4

IQueryable<T> itself inherits from IEnumerable<T>,所以它比IEnumerable<T>更具体,尽管ObjectQuery<T>实现了两个通用接口。

+0

,但是当编译器看到客户/ * EF实体*/ 。选择c => c.Name.ToUpper()) .OrderBy(n => n)'......它是否总是在继承的最低链中向上看? –

+0

@RoyiNamir:是的。如果有两个方法具有相同的签名,但是一个接口或类型可以扩展另一个接口或类型,编译器将选择使用更具体参数的重载,除非您显式强制该参数不那么具体(例如,通过AsEnumerable ()'扩展方法)。 – StriplingWarrior

+0

如果1个方法接受int并且另一个接受object - 决定将在编译时关于编译时间的类型,所以如果我写'int i = 3; doWork(i)'doWork的int版本将会运行。如果我发送'对象我= 5; doWork(i)'doWork的对象版本将运行.......但是这里我没有**任何编译时间类型......所以他怎么做呢? –