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

时间:2012-07-07 22:57:07

标签: c# visual-studio extension-methods intellisense

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

enter image description here

1 个答案:

答案 0 :(得分:5)

我假设CampaignsDbSet<Campaign>的实例? DbSet继承DbQuery,其实现IOrderedQueryabledefinition为:{/ p>

public interface IOrderedQueryable<out T> : IQueryable<T>, 
    IEnumerable<T>, IOrderedQueryable, IQueryable, IEnumerable

正如您所看到的,IQueryable<T>IEnumerable<T>都已实现,但IQueryable的定义表明它扩展了IEnumerable

public interface IQueryable : IEnumerable

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

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

希望有道理:)