【问题标题】:Why do I need to cast a dynamic object when calling IEnumerable.Contains()? [duplicate]为什么在调用 IEnumerable.Contains() 时需要强制转换动态对象? [复制]
【发布时间】:2016-02-07 22:28:01
【问题描述】:

我正在尝试使用 dynamic 参数调用 IEnumerable.Contains(),但出现错误

'IEnumerable' 不包含'Contains' 的定义,并且最佳扩展方法重载'Queryable.Contains(IQueryable, TSource)' 有一些无效参数

我注意到我可以将参数转换为正确的类型,或者使用基础集合类型来解决问题。但我不确定为什么我不能直接传入参数。

dynamic d = "test";
var s = new HashSet<string>();
IEnumerable<string> ie = s;

s.Contains(d);           // Works
ie.Contains(d);          // Does not work
ie.Contains((string)d);  // Works

【问题讨论】:

  • @JonSkeet 如果我删除它,它会在我的 vs2012 no biggie 中引发错误
  • 我可能有错字@JonSkeet 我将删除评论以消除任何混淆
  • @JonSkeet 我已经删除了..再次感谢。

标签: c# dynamic ienumerable contains


【解决方案1】:

Enumerable.Contains 是一种扩展方法 - 扩展方法不会被执行时使用的迷你编译器解析。 (扩展方法依赖于 using 指令,这些指令没有被保留。它们可能是,但我想这被认为有点痛苦。)这包括使用 dynamic 扩展方法的参数,和 em> 将它们用作扩展方法的“目标”。

直接指定扩展方法即可:

var result = Enumerable.Contains(ie, d);

【讨论】:

  • 这适用于online compiler
  • @ryanyuyu 不,当您将鼠标悬停在b = ie.Contains(d); 上单击链接时,它不会引发错误注意波浪形的红线
  • @MethodMan 并注意这是 OP 的原始代码产生的波浪。 Jon Skeet 的解决方案不会产生错误。
猜你喜欢
  • 1970-01-01
  • 2012-04-12
  • 1970-01-01
  • 1970-01-01
  • 2015-01-29
  • 2019-11-06
  • 2016-10-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多