Considerando il codice seguente:Se si esegue il cast di un IQueryable come IEnumerable, si chiama un metodo di estensione Linq, che viene chiamata l'implementazione?
IQueryable<T> queryable;
// something to instantiate queryable
var enumerable = (IEnumerable<T>) queryable;
var filtered = enumerable.Where(i => i > 3);
Nella riga finale, il quale metodo di estensione viene chiamato?
È IEnumerable<T>.Where(...)
? O sarà chiamato IQueryable<T>.Where(...)
perché l'effettiva implementazione è ancora ovviamente interrogabile?
Presumibilmente, l'ideale sarebbe che venga chiamata la versione IQueryable, nello stesso modo in cui il normale polimorfismo utilizzerà sempre l'override più specifico.
In Visual Studio, tuttavia, quando faccio clic con il pulsante destro del mouse sul metodo Where e su "Vai alla definizione", sono portato alla versione IEnumerable, che ha senso da un punto di vista visivo.
La mia preoccupazione principale è che se da qualche parte nella mia app uso Linq su NHibernate per ottenere un interrogativo, ma lo passo usando un'interfaccia che usa la più generale firma IEnumerable, perderò le meraviglie dell'esecuzione del database posticipato !
Edit: Si scopre che, come Iridium ha fatto notare, è la versione Enumerable che viene chiamato
public class Program
{
static void Main(string[] args)
{
var myString2 = new MyString2();
var myString = (MyString)myString2;
Console.WriteLine(myString.Method());
Console.ReadLine();
}
}
public class MyString {}
public class MyString2 : MyString {}
public static class ExtensionMethods
{
public static string Method(this MyString instance)
{
return "MyString method";
}
public static string Method(this MyString2 instance)
{
return "MyString2 method";
}
}
L'uscita è "il metodo MyString".
Hai dimenticato di votare la domanda ... è stato interessante scoprirlo :). –
http://stackoverflow.com/questions/474074/overriding-extension-methods –
Ricordate, la sintassi del metodo di estensione è solo uno zucchero sintattico per * chiamare un metodo statico * e metodi statici per definizione * utilizzare l'analisi statica per determinare quale metodo chiamata*. Se si desidera l'analisi * runtime *, è necessario scrivere il codice per farlo. Inoltre: non è * considerato * auspicabile per un IQ che sia staticamente un IE che si ritrasforma inaspettatamente al percorso del codice IQ; presumibilmente lo lanci su un IE perché tu * non * vuoi trattarlo come un QI! Se vuoi trattarlo come un QI, allora * non gettarlo via *. La regola di Groucho: se fa male quando lo fai, * non farlo *. –