Nie jestem do końca pewny, jak sprawić, aby to pytanie było zrozumiałe, ale wysłuchaj mnie i mam nadzieję, że zrozumiesz mój problem, kiedy dotrzemy do końca (przynajmniej jest on łatwy do odtworzenia).Dlaczego wnioskowanie o typie metody nie pozwala określić parametru typu?
Próbuję wywołać metodę używaną do sprawdzania poprawności wyników w jednostkach testowych. To ma następujący podpis:
void AssertPropertyValues<TEnumerable, TElement, TProperty>(
TEnumerable enumerable,
Func<TElement, TProperty> propertyPointer,
params TProperty[] expectedValues)
where TEnumerable : System.Collections.Generic.IList<TElement>
co to oznacza to, że ma następujące wejścia
- Każdy obiekt, który jest przeliczalny, a zawiera obiekty tego samego typu co intput za 2).
- Func (zwykle enkapsulujące wyrażenia lambda), które pobiera obiekt tego samego typu co "zawartość" 1) i zwraca obiekt tego samego typu co Typ zawartości tablicy podanej w 3).
- Tablica obiektów tego samego typu, co wyjściowa funkcja Func in 2).
więc rzeczywiste wykonanie tej metody może wyglądać następująco:
AssertPropertyValues(
item.ItemGroups,
itemGroup => itemGroup.Name,
"Name1", "Name2", "Name3");
Przynajmniej tak jest, jak chciałbym to wyglądać, ale biegnę do znanego błędu kompilatora: "Argumentów typu dla metody" X "nie da się wywnioskować z użycia". I tego właśnie nie rozumiem. Powinien mieć wszystkie potrzebne informacje, o ile widzę, a może jest to kolejna wersja problemu "Kowariancji i Kontrawariancji"?
Więc teraz jestem zmuszony robić to tak zamiast:
AssertPropertyValues(
item.ItemGroups,
(ItemGroup itemGroup) => itemGroup.Name,
"Name1", "Name2", "Name3");
Czy ktoś może wskazać, dlaczego ten scenariusz nie można wywnioskować przez kompilator?
Czy próbowałeś użyć 'IEnumerable' lub sth podobnie zamiast 'TEnumerable'? w zasadzie parametr 'propertyPointer' powinien być taki sam, jak predykat, np. w metodzie' Enumerable.Select'-extension (a więc i całej konstrukcji), której typem jest 'item.ItemGroups' (dowolna missmatch, która czyni podpis jawny jest obowiązkowy?)? w przeciwnym razie nie napotkasz problemu, przed którym stoisz ... –
Naprawiłem formatowanie próbek kodu tak, aby były sensowne i zmieniły nazwę na pytanie; to nie ma nic wspólnego z lambdą. –
@AndreasNiedermair Mój problem wynika z tego, że początkowo miałem to ograniczenie w wielu miejscach, i w niektórych miejscach używałem ich jako typów zwrotów, a zatem nie mogłem "zrobić" tylko z interfejsami. Już nie w przypadku wypróbowywania rozwiązania EricLipperta. –