扩展方法分辨率 IQueryable vs IEnumerable
本文关键字:vs IEnumerable IQueryable 分辨率 方法 扩展 | 更新日期: 2023-09-27 18:18:50
假设我有一个实现IQueryable<>
(继承IEnumerable<>
(接口的类。
当我在其上调用Where()
方法时,编译器将此调用解析为IQueryable
扩展,尽管IEnumerable
扩展也定义了Where()
方法。
问题是编译器如何理解应该调用哪个扩展?
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>
是更好的转换目标,并且优先。