当智能感知相同的扩展方法两次但在不同类型上定义时会发生什么?

Aar*_*ide 0 c# intellisense extension-methods visual-studio

使用EF时,ObjectContext我会看到两种不同的扩展方法,其签名与连续选择相同.对我来说没有任何意义,根据我选择的那个,会有一些魔法导致一个或另一个被调用,那么实际发生了什么?

在此输入图像描述

gre*_*g84 5

我假设那Campaigns是一个实例DbSet<Campaign>DbSetinherits DbQuery,实现IOrderedQueryable,其定义是:

public interface IOrderedQueryable<out T> : IQueryable<T>, 
    IEnumerable<T>, IOrderedQueryable, IQueryable, IEnumerable
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,IQueryable<T>IEnumerable<T>得到实施,但定义IQueryable表明,它扩展IEnumerable:

public interface IQueryable : IEnumerable

所以基本上,扩展方法是为了实现的IEnumerable,但它也可以从IQueryable扩展原始接口时获得.Intellisense正在挑选这两个选项,因为你最终可能会隐式或明确地将类型转换为IEnumerable.

实际运行的方法取决于调用它的类型.例如,在您的方法Campaigns实例DbSet<Campaign>上将它(如果您正在使用MS SQL)转换为SELECT TOP 1...查询,但如果您正在调用它Campaigns.ToList(),也就是说IEnumerable,它将返回零索引处的项目.每种类型的扩展方法的实现都不同.

希望有道理:)