为什么在调用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

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

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

只需直接指定扩展方法即可:

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