为什么在调用IEnumerable.Contains()时需要强制转换动态对象
本文关键字:转换 对象 动态 调用 IEnumerable Contains 为什么 | 更新日期: 2023-09-27 18:21:05
我正试图用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
Enumerable.Contains
是一个扩展方法,并且在执行时使用的迷你编译器不会解析扩展方法。(扩展方法依赖于using
指令,这些指令没有被保留。它们可能会被保留,但我想这被视为有点痛苦。)这包括对扩展方法使用dynamic
参数,和将它们用作扩展方法的"目标"。
只需直接指定扩展方法即可:
var result = Enumerable.Contains(ie, d);