【问题标题】:how VAR is determined against many options?如何根据许多选项确定 VAR?
【发布时间】:2012-06-22 15:11:41
【问题描述】:

我有这个代码:

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...

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

有什么帮助吗?它怎么知道使用A ||乙?

【问题讨论】:

  • 判断 var 在 Visual Studio 中使用的类型的一种简单方法是将鼠标悬停在 var 关键字上,然后弹出窗口会告诉您它是什么类型。 C# in Depth 有一个很好的部分解释了类型推断在 C# 中的工作原理。
  • @EricAndres 我有 resharper,它做得更好:)...我只是想了解这个决定是如何做出的 :).. 谢谢人

标签: c# .net entity-framework .net-4.0 iqueryable


【解决方案1】:

IQueryable&lt;T&gt; itself inherits from IEnumerable&lt;T&gt;,因此它比IEnumerable&lt;T&gt; 更具体,尽管ObjectQuery&lt;T&gt; 实现了两个通用接口。

【讨论】:

  • 但是当编译器看到customers /*EF entity*/ .Select (c =&gt; c.Name.ToUpper()) .OrderBy (n =&gt; n) ...它是否总是在较低的继承链中寻找顶部?
  • @RoyiNamir:是的。如果有两个方法具有相同的签名,但一个采用扩展另一个接口或类型,编译器将选择采用更具体参数的重载,除非您明确地将参数强制转换为不太具体(例如,通过 @987654327 @扩展方法)。
  • 如果 1 个方法接受 int 而另一个接受对象 - 将在编译时决定该类型的编译时间,所以如果我写 int i=3; doWork(i),doWork 的 int 版本将运行。如果我发送object i=5; doWork(i),doWork 的对象版本将运行.......但是这里我没有任何编译时间类型......那么他是怎么做到的呢?跨度>
  • 没有编译时类型是什么意思? var 在编译时评估,而不是在运行时评估。
  • 我的意思是它就像 var i=5;所以我是 int ant 不是 object ...int 比 object 更具体....同一个例子...没有?
猜你喜欢
  • 2021-08-13
  • 1970-01-01
  • 1970-01-01
  • 2017-09-01
  • 2021-01-26
  • 1970-01-01
  • 2019-11-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多