Un Func<T>
è un delegato (un puntatore a una funzione), mentre un Expression<Func<T>>
è un albero di espressione (una struttura di dati ad albero che descrive un'operazione). Ne consegue che non è possibile assegnarne una all'altra, in quanto sono completamente dissimili.
Quando si assegna una funzione lambda direttamente a Func<T>
il compilatore compila il codice per la propria funzione e assegna un puntatore al codice compilato per es. func
.
D'altra parte, quando si assegna una funzione lambda direttamente a un Expression<Func<T>>
il compilatore crea l'albero delle espressioni (che è semplicemente un'istanza di un tipo di riferimento) e assegna un riferimento a tale oggetto ad es. expr1
. Questa è solo una comodità che il compilatore fornisce all'utente, offrendoti un'opzione molto più attraente della costruzione manuale dell'albero delle espressioni in codice (che ovviamente è anche completamente possibile).
Un sacco di buone spiegazioni su livelli inferiori ma ricordati che puoi sempre fare questo se si adatta alle vostre esigenze: 'Func