Należy zauważyć, że dziedziczenie _src dziedziczy IQueryable<U>
i dziedziczy po new()
;C# Linq Wybierz problem w łańcuchu metod
Napisałem następujące oświadczenie, nie ma błędu składni.
IQueryable<V> a = from s in _src where (s.Right - 1 == s.Left) select new V();
Ale jeśli re-pisze to w następujący sposób, edytor Visual Studio narzeka błąd w "Wybierz"
IQueryable<V> d = _src.Where(s => s.Right - 1 == s.Left).Select(s=> new V());
błędu jest:
The type arguments cannot be inferred from the usage. Try specifying the type arguments explicitly.
Candidates are:
System.Collections.Generic.IEnumerable<V> Select<U,V>(this System.Collections.Generic.IEnumerable<U>, System.Func<U,V>) (in class Enumerable)
System.Linq.IQueryable<V> Select<U,V>(this System.Linq.IQueryable<U>, System.Linq.Expressions.Expression<System.Func<U,V>>) (in class Queryable)
Czy ktoś może wyjaśnić to zjawisko i jakie rozwiązanie polega na naprawieniu błędu?
=== Edit (2010-03-16 17:35) ===
Dzięki Mike Two. Próbowałem też prosty przykład jak ty. Działa, ale to nie działa w moim. Wysłałem kod w następujący sposób:
public class NSM<U, V> where U : IQueryable<U> where V : new()
{
private U _src;
public NSM(U source) { _src = source; }
public IQueryable<V> LeafNodes
{
get
{
return from s in _src where (s.Right - 1 == s.Left) select new V();
}
}
}
Chcę, aby funkcja LeafNodes została przepisana na metodę łańcucha metody linq. Dowolny pomysł?
Dzięki wszystkim. Jakie jest równoważne stwierdzenie pierwszego? – Gnought
Ten kod, który dodałeś, nie będzie się kompilował, chyba że U jest czymś, co ma właściwość Prawy i Lewy. Więc nie może to być po prostu 'IQueryable ' chyba że istnieje 'where U: ILeftRight' lub coś podobnego. –
Wyjaśniałem to dzięki twojej zaktualizowanej próbce. Zobacz zaktualizowaną odpowiedź poniżej. Dziękuję za udzielenie dodatkowych informacji. –