2015-11-06 69 views
5

我想打电话给IEnumerable.Contains()dynamic的说法,但我得到的错误为什么在调用IEnumerable.Contains()时需要投射动态对象?

“的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 
+0

@JonSkeet如果我删除它,它会抛出错误在我的vs2012根本不算什么 – MethodMan

+0

我可能有一个错字@JonSkeet我会删除评论,以消除任何混乱 – MethodMan

+0

@JonSkeet我删除了..再次感谢。 – MethodMan

回答

5

Enumerable.Contains是一个扩展方法 - 和扩展方法不受其在执行时所使用的微型编译器解决。 (执行方法取决于using指令,它们不会被保留,它们可能是,但我认为这看起来有点痛苦)。这包括使用扩展方法的dynamic参数,使用作为“目标“的扩展方法。

只要指定的扩展方法,而不是直接:

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

这适用于此[在线编译器](https://dotnetfiddle.net/xPvF8e)。 – ryanyuyu

+0

@ryanyuyu不,它不会抛出一个错误,当你把鼠标悬停在'b = ie.Contains(d);'上时,会出现错误的红色线条'点击链接 – MethodMan

+0

@MethodMan并注意到这是OP的原始代码,弯弯曲曲。 Jon Skeet的解决方案不会产生错误。 – ryanyuyu

相关问题