Ho la seguente classe di estensioni:I metodi di estensione per le interfacce sono considerati meno prioritari rispetto a quelli meno specifici?
public static class MatcherExtensions
{
public static ExecMatcher<T1, T2> Match<T1, T2>(this Tuple<T1, T2> item)
{
return new ExecMatcher<T1, T2>(item.Item1, item.Item2);
}
public static ExecMatcher<T1, T2> Match<T1, T2>(this ITupleMatchable<T1, T2> item)
{
var tuple = item.PropertiesToMatch;
return new ExecMatcher<T1, T2>(tuple.Item1, tuple.Item2);
}
public static ExecMatcher<T> Match<T>(this T item) { return new ExecMatcher<T>(item); }
}
Se creo una tupla e invoco Match()
, utilizza correttamente la prima metodo di estensione:
var tuple = Tuple.Create(1, "a");
tuple.Match().With(1, "a")... // compiles just fine.
Se creo un int e invoco Match()
, si utilizza correttamente l'ultimo metodo di estensione:
var one = 1;
one.Match().With(1)... // compiles just fine.
Tuttavia se creo SomeClass
, che implementa ITupleMatchable<int, string>
e cercare di abbinare su di esso, il compilatore sceglie ancora il terzo metodo di estensione, piuttosto che la seconda, pur essendo quest'ultimo una più specifica partita:
var obj = new SomeClass(1, "a");
obj.Match().With(1, "a")... // won't compile.
Sulla base Eric Lippert's answer to a similar question, ho lavorato attorno a questo mettendo il terzo metodo di estensione nella propria classe all'interno di una sottodirectory, creando così uno spazio dei nomi più lungo e quindi più "distanza" tra esso e il codice chiamante rispetto alla versione specifica a ITupleMatchable<T1, T2>
. Questo mi sembra un trucco per me. C'è un modo più ordinato per risolvere questo?
'ITupleMatchable obj = new SomeClass (1," a ");' dovrebbe funzionare, non dovrebbe? –
Se la tua domanda è principalmente quella nel titolo della tua domanda, allora penso che il post di Eric Lippert che hai collegato risponda in modo abbastanza conclusivo, quindi questa domanda è davvero un duplicato di quella.Se stai cercando soluzioni alternative, prova a cambiare la domanda nel titolo per riflettere questo. – sstan
@sstan, la risposta di Eric spiega come risolvere il problema (come spiegato nella mia domanda). Non affronta la mia domanda per quanto riguarda il motivo per cui una firma meno specifica viene scelta su una più specifica (per quanto posso vedere). Mi piacerebbe che tu mi correggessi, sottolineando ciò che mi manca :) –