2010-07-29 9 views
6

Lorsque vous essayez de répondre this question, j'ai découvert ce qui suit:Moulage et LINQ Moulage <T>()

string s = "test"; 

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

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

Pourquoi Cast<T>() échouent ici? Quelle est la différence?

Répondre

12

pense que vous trouverez votre réponse ici:

Puzzling Enumerable.Cast InvalidCastException

La dernière partie, sous Edit:

Cast<T>() est une méthode d'extension sur IEnumerable plutôt que IEnumerable<T>. Cela signifie que le temps chaque valeur arrive au point où train d'être lancé, il a déjà été boxed de nouveau dans un System.Object

+1

Merci Martin. C'est intéressant. Donc Cast devrait probablement être évité de toute façon pour la pénalité de performance inhérente à la boxe. Je suis surpris MSDN ne mentionne nulle part (que j'ai pu trouver, de toute façon). – fearofawhackplanet

+5

'Cast ' est uniquement destiné à être utilisé pour amener 'IEnumerable' au niveau d'un' IEnumerable ', où tous les autres opérateurs LINQ sont définis. Prendre un 'IEnumerable ' et le convertir en un 'IEnumerable ' est une projection, qui est faite par 'Select'. Le fait que 'Cast' est même possible sur un' IEnumerable 'est simplement parce que' IEnumerable 'hérite de' IEnumerable' - aucune autre raison. –

Questions connexes