扩展方法分辨率 IQueryable vs IEnumerable

本文关键字:vs IEnumerable IQueryable 分辨率 方法 扩展 | 更新日期: 2023-09-27 18:18:50

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

当我在其上调用Where()方法时,编译器将此调用解析为IQueryable扩展,尽管IEnumerable扩展也定义了Where()方法。

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

扩展方法分辨率 IQueryable vs IEnumerable

C# 规范中有描述:

7.5.3.5 更好的转化目标

给定两种不同类型的T1T2T1是更好的转化目标 如果以下至少一项成立,则T2

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

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

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