假设我有一个实现IQueryable<>
(继承IEnumerable<>
)接口的类。
当我在其上调用Where()
方法时,虽然IQueryable
扩展程序还定义了IEnumerable
方法,但编译器会将此调用解析为Where()
个扩展名。
问题是编译器如何理解应该调用哪个扩展名?
答案 0 :(得分:15)
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>
是更好的转换目标,并优先。