为什么在调用IEnumerable.Contains()时需要强制转换动态对象?

时间:2015-11-06 17:36:30

标签: c# dynamic ienumerable contains

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

  

' IEnumerable的'不包含'包含'的定义和最好的扩展方法重载' 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

1 个答案:

答案 0 :(得分:6)

Enumerable.Contains是一种扩展方法 - 并且扩展方法不会被执行时使用的迷你编译器解析。 (扩展方法取决于using指令,这些指令没有被保留。它们可能是,但我想这看起来有点痛苦。)这包括使用dynamic参数扩展方法, 将它们用作&#34;目标&#34;扩展方法。

只需直接指定扩展方法:

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