C# Language Opérations de coulée LINQ


Exemple

Supposons que vous ayez des types comme ceux-ci:

interface IThing {  }
class Thing : IThing {  }

LINQ vous permet de créer une projection qui modifie le type générique de compilation d'un IEnumerable<> via les méthodes d'extension Enumerable.Cast<>() et Enumerable.OfType<>() .

IEnumerable<IThing> things = new IThing[] {new Thing()};
IEnumerable<Thing> things2 = things.Cast<Thing>();
IEnumerable<Thing> things3 = things.OfType<Thing>();

Lorsque things2 est évalué, la méthode Cast<>() essaiera de transposer toutes les valeurs des things dans Thing s. S'il rencontre une valeur qui ne peut pas être InvalidCastException , une InvalidCastException sera lancée.

Lorsque things3 est évalué, la OfType<>() fera de même, sauf que si elle rencontre une valeur qui ne peut pas être convertie, elle omettra simplement cette valeur plutôt que de lancer une exception.

En raison du type générique de ces méthodes, ils ne peuvent pas appeler des opérateurs de conversion ou effectuer des conversions numériques.

double[] doubles = new[]{1,2,3}.Cast<double>().ToArray(); // Throws InvalidCastException

Vous pouvez simplement effectuer un transtypage dans un .Select() comme solution de contournement:

double[] doubles = new[]{1,2,3}.Select(i => (double)i).ToArray();