2010-07-29 17 views
6

Quando si cerca di rispondere this question, ho scoperto i seguenti:Casting e Linq Fusioni <T>()

string s = "test"; 

var result1 = s.Select(c => (ushort)c); // works fine 

var result2 = s.Cast<ushort>(); // throws an invalid cast exception 

Perché Cast<T>() falliscono qui? Qual è la differenza?

risposta

12

credo che troverete la risposta qui:

Puzzling Enumerable.Cast InvalidCastException

L'ultima parte, in Modifica:

Cast<T>() è un metodo di estensione sul IEnumerable piuttosto che IEnumerable<T>. Ciò significa che per il momento ogni valore arriva al punto in cui è in fase di getto, è già stato scatola di nuovo in un System.Object

+1

Grazie Martin. Interessante. Quindi Cast dovrebbe probabilmente essere evitato in ogni caso per la penalità relativa alle prestazioni del pugilato. Sono sorpreso MSDN non menziona questo ovunque (che ho potuto trovare, comunque). – fearofawhackplanet

+5

'Cast ' è destinato esclusivamente all'utilizzo di un 'IEnumerable' fino al livello di un' IEnumerable ', dove sono definiti tutti gli altri operatori LINQ. Prendendo un 'IEnumerable ' e convertendolo in un 'IEnumerable ' è una proiezione, che è fatta da 'Select'. Il fatto che 'Cast' sia possibile anche su un' IEnumerable 'è semplicemente perché' IEnumerable 'eredita da' IEnumerable' - nessun altro motivo. –