Objets d'un type particulier dans le foreach à partir d'un IEnumerable
Je travaille avec un héritage objet de collection qui n'implémente que les non-générique IEnumerable
et ICollection
. Ce qui se passe exactement avec cet objet, lorsque j'essaie d'utiliser cet objet avec un foreach
donner une plus spécifique sur la GAUCHE de la boucle foreach expression?
//LegacyFooCollection implements non-generic IEnumerable
LegacyFooCollection collection = GetFooCollection();
foreach (Foo f in collection)
{
//etc.
}
Je sais (parce que j'ai essayé) que c'est sûr, quand tout dans la collection
est vraiment de type Foo
, mais ce qui se passe, si cela échoue?
- J'ai pensé qu'il serait nulle dans ce cas.
Vous devez vous connecter pour publier un commentaire.
Le compilateur C# effectue la distribution implicitement pour vous. En termes de casting (mais seulement en ces termes1), c'est l'équivalent de:
Noter que ce sera le cas avec générique des collections:
Tout ceci est détaillé dans la section 8.8.4 du C# 4 spec.
Si vous êtes en utilisant .NET 3.5 ou plus et que vous voulez seulement de sélectionner des éléments du type approprié, vous pouvez utiliser
Énumérable.OfType
:Qui peut ne pas être nécessaire pour un
LegacyFooCollection
, mais il peut être utile lorsque vous essayez de trouver (dire) toutes lesTextBox
des contrôles dans un formulaire.1 Les différences sont:
f
est en lecture seule; dans la "conversion", il est accessible en écrituref
vous (pour l'instant) de capture d'une seule variable à travers toutes les itérations, par opposition à une variable séparée par itération dans la "conversion"foreach (object tmp in collection)
. Ensuite, vous pouvez affecter ce que vous voulezf
dans votre exemple, si vous ne pouvez pas le faire dans le cas des OP exemple, depuis sonf
est un foreach variable d'itération. (Une subtile, mais importante différence.)Ce code va créer un moteur d'exécution de la conversion de type (cast) de chaque élément de l'énumération de
Foo
. Donc, si vous neforeach (string f in collection)
vous désirez obtenir unClassCastException
au moment de l'exécution, la première fois qu'il essaie de convertir unFoo
référence à unString
de référence.Il sera coulée à chaque fois. Le
foreach
boucle est seulement à l'aide de laIEnumerator
méthodes.Court moulé dans ForEeach: