扩展方法解析IQueryable vs IEnumerable

时间:2014-08-20 05:34:10

标签: c# .net

假设我有一个实现IQueryable<>(继承IEnumerable<>)接口的类。

当我在其上调用Where()方法时,虽然IQueryable扩展程序还定义了IEnumerable方法,但编译器会将此调用解析为Where()个扩展名。

问题是编译器如何理解应该调用哪个扩展名?

1 个答案:

答案 0 :(得分:15)

C#规范描述了:

  

7.5.3.5更好的转化目标

     

鉴于两种不同类型T1T2T1是更好的转化目标   如果至少满足下列条件之一,则为T2

     
      
  • 存在从T1T2的隐式转换,并且不存在从T2T1的隐式转换

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

  •   

由于存在从IQueryable<T>IEnumerable<T>的隐式转换,并且没有从IEnumerable<T>IQueryable<T>的隐式转换,IQueryable<T>是更好的转换目标,并优先。