Non sono esattamente sicuro di come rendere questa domanda leggibile/comprensibile, ma ascoltami e spero che capirai il mio problema quando arriveremo alla fine (per lo meno è facilmente riproducibile).Perché l'inferenza del metodo non riesce a dedurre un parametro di tipo?
Provo a chiamare un metodo utilizzato per la convalida dei risultati in UnitTests. Essa ha la seguente firma:
void AssertPropertyValues<TEnumerable, TElement, TProperty>(
TEnumerable enumerable,
Func<TElement, TProperty> propertyPointer,
params TProperty[] expectedValues)
where TEnumerable : System.Collections.Generic.IList<TElement>
Ciò significa, che prende il seguente ingresso
- Qualsiasi oggetto enumerabile, e contiene oggetti dello stesso tipo come gli input per 2).
- Un Func (espressioni lambda di solito incapsulanti) che accetta un oggetto dello stesso tipo come "contenuto" di 1) e restituisce un oggetto dello stesso tipo del Tipo del contenuto dell'array fornito in 3).
- Un array di oggetti dello stesso tipo dell'output di Func in 2).
Quindi, una effettiva esecuzione di questo metodo potrebbe essere la seguente:
AssertPropertyValues(
item.ItemGroups,
itemGroup => itemGroup.Name,
"Name1", "Name2", "Name3");
Almeno, è così che mi piacerebbe farlo sembrare come, ma mi imbatto in l'errore del compilatore ben nota: "Gli argomenti tipo per il metodo 'X' non possono essere dedotti dall'utilizzo.", Ed è quello che non capisco. Dovrebbe avere tutte le informazioni necessarie per quanto posso vedere, o forse è un'altra versione del problema "Covariance and Contravariance"?
Quindi per ora sono costretto a farlo in questo modo, invece:
AssertPropertyValues(
item.ItemGroups,
(ItemGroup itemGroup) => itemGroup.Name,
"Name1", "Name2", "Name3");
Chiunque può segnalare il motivo per cui questo scenario non si può dedurre dal compilatore?
hai provato a usare 'IEnumerable' o sth allo stesso modo di 'TEnumerable'? in pratica il parametro 'propertyPointer' dovrebbe essere lo stesso del predicato, ad es. nel metodo di estensione' Enumerable.Select' (e quindi l'intero costrutto funziona allo stesso modo) ... quale tipo ha 'item.ItemGroups' ha (qualsiasi errore, che rende la firma esplicita è obbligatoria?)? altrimenti non ho il problema che stai affrontando ... –
Ho corretto la formattazione dei tuoi esempi di codice in modo che siano ragionevoli e rinominati la tua domanda; questo non ha niente a che fare con il lambda. –
@AndreasNiedermair Il mio problema deriva dal fatto che originariamente avevo questo vincolo in più posizioni, e in alcuni punti li usavo come tipi di ritorno, e quindi non potevo "accontentarli" con le sole interfacce. Non è più il caso quando provi la soluzione di EricLippert. –