加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 为什么动态IEnumerable上的First()或ElementAt()等待?

发布时间:2020-12-15 08:15:37 所属栏目:百科 来源:网络整理
导读:我正在使用Dapper并让它返回一个动态IEnumerable,如下所示: var rows = conn.Query("SELECT * FROM T WHERE ID = @id",new { id = tableId });var row = rows.FirstOrDefault(); 这里的行是IEnumerable dynamic类型. IntelliSense称FirstOrDefault()是等待
我正在使用Dapper并让它返回一个动态IEnumerable,如下所示:
var rows = conn.Query("SELECT * FROM T WHERE ID = @id",new { id = tableId });
var row = rows.FirstOrDefault();

这里的行是IEnumerable< dynamic>类型. IntelliSense称FirstOrDefault()是等待的,其用途等待FirstOrDefault().并非所有LINQ查询都显示为等待,但似乎特别是那些单独输出元素的查询.

一旦我改为使用强类型,这种行为就会消失.

是因为.NET无法知道您在运行时接收的类型是否等待,以便它“允许”它,以防您需要它?但是不强制执行吗?或者我应该,由于一些动态语言运行时行为,实际上在这里使用等待?

我一直在搜索,但没有在网上找到最小的东西.

解决方法

编译器的async-await功能取决于 Duck Typing.因此,所有具有GetAwaiter方法(实例或扩展方法)的方法都返回实现INotifyCompletion接口的类型并具有下一个字段:

> bool IsCompleted {get; }
> void | TResult GetResult()

可以等待.

您可以在编译时(从docs开始)在动态类型上调用您想要的任何内容:

At compile time,an element that is typed as dynamic is assumed to support any operation.

这就是编译器在编译时没有显示任何警告/错误的原因,但在运行时,您将得到类似于以下内容的异常:

RuntimeBinderException.

‘<>f__AnonymousType0’ does not contain a definition for ‘GetAwaiter’

如果指定类型显式编译器将搜索方法GetAwaiter.然后,如果您的强类型不包含它,您将得到编译时错误.

所以,你的问题的答案确实是因为动态的特殊行为.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读