扩展方法解析IQueryable vs IEnumerable

7
假设我有一个实现了 IQueryable<> 接口(继承自 IEnumerable<>)的类。
当我在它上面调用 Where() 方法时,编译器会将此调用解析为 IQueryable 扩展方法,尽管 IEnumerable 扩展方法也定义了 Where() 方法。
问题是编译器如何理解应该调用哪个扩展方法?
1个回答

16

C#规范对此进行了描述:

7.5.3.5 更好的转换目标

给定两种不同的类型T1和T2,如果以下至少一种情况为真,则T1是比T2更好的转换目标:

  • T1到T2之间存在隐式转换,并且从T2到T1没有隐式转换

  • T1是有符号整数类型,而T2是无符号整数类型。

由于从 IQueryable<T>IEnumerable<T> 存在隐式转换,而从 IEnumerable<T>IQueryable<T> 不存在隐式转换, 因此 IQueryable<T> 是更好的转换目标,并具有优先权。


在 IQueryable<T> 到 IEnumerable<T> 之间的隐式转换是在哪里定义的?我知道 IQueryable<T> 继承自 IEnumerable<T>。但是不允许将其隐式转换为基类。 - dvjanm
@jannagy02,这绝对是允许的。IEnumerable<T> 对于 T 是协变的。 - Servy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接