Volevo scrivere un metodo di estensione che avrebbe funzionato su dizionari i cui valori erano una sorta di sequenza. Sfortunatamente, il compilatore non sembra inferire gli argomenti generici dal mio uso del metodo; Devo specificarli esplicitamente.Generici: perché il compilatore non può inferire gli argomenti del tipo in questo caso?
public static void SomeMethod<TKey, TUnderlyingValue, TValue>
(this IDictionary<TKey, TValue> dict)
where TValue : IEnumerable<TUnderlyingValue> { }
static void Usage()
{
var dict = new Dictionary<int, string[]>();
var dict2 = new Dictionary<int, IEnumerable<string>>();
//These don't compile
dict.SomeMethod();
SomeMethod(dict); // doesn't have anything to do with extension-methods
dict2.SomeMethod(); // hoped this would be easier to infer but no joy
//These work fine
dict.SomeMethod<int, string, string[]>();
dict2.SomeMethod<int, string, IEnumerable<string>>();
}
mi rendo conto che l'inferenza dei tipi non è una scienza esatta, ma mi chiedevo se c'è qualche fondamentale 'regola' che mi manca qui - io non sono a conoscenza dei dettagli della spec.
- Si tratta di una carenza del processo di deduzione o è la mia aspettativa che il compilatore debba "capirlo" in questo caso irragionevole (forse ambiguità)?
- Posso modificare la firma del metodo in un modo che lo renda ugualmente funzionale e tuttavia "inafferrabile"?
Inferring TUnderlyingValue potrebbe essere difficile. Soprattutto perché il parametro type di 'IEnumerable <>' è covariante in .net 4. – CodesInChaos
L'inferenza di tipo è una scienza esatta che ha algoritmi formali, non è solo un'ipotesi. Se un compilatore non è in grado di dedurre un tipo è solo perché non ha regole specifiche per gestire alcuni casi, e di solito è un progetto di implementazione, non un limite. Dai un'occhiata qui: http://www.classes.cs.uchicago.edu/archive/2005/winter/33600-1/slides/Lesson10.pdf – Jack
@Jack: Grazie per il link; Interessante. Vedi il mio commento sulla risposta di Eric Lippert per quello che intendevo. Scarsa scelta di parole da parte mia, suppongo. – Ani