0

EFObjectContextを使用すると、連続した選択肢と同じシグニチャを持つ2つの異なる拡張メソッドが表示されます。どちらを選んだかに基づいて、どちらか一方が呼び出されるような魔法があるのは私には意味がありません。実際に何が起こっているのでしょうか。

ここに画像の説明を入力してください

4

1 に答える 1

5

私はそれが?Campaignsのインスタンスだと思います を継承します。これは、を実装します。その定義は次のとおりです。DbSet<Campaign>DbSetDbQueryIOrderedQueryable

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()、つまりIEnumerable、ゼロインデックスでアイテムが返されます。拡張メソッドの実装は、タイプごとに異なります。

それが理にかなっていることを願っています:)

于 2012-07-07T23:22:04.123 に答える