2010-11-09 30 views
1

Scénario
J'ai trois listes IEnumerable - IEnumerable<Dog>, IEnumerable<Cat> et IEnumerable<Horse>. Je les veux en tout dans un seul IEnumerable<NameColor>.
J'ai un public static explicit operator NameColor défini sur chacun des Chien, Chat et objets de chevaux pour me permettre de les jeter à NameColorC# Opérateur Union

Alors:

IEnumerable<NameColor> list = dogs as IEnumerable<NameColor>; 
list = list.Union(cats as IEnumerable<NameColor>); 
list = list.Union(horses as IEnumerable<NameColor>); 

Toutefois, ce travail ne marche pas. Je reçois l'erreur Value cannot be null. Parameter name: first mais je ne vois pas un paramètre appelé first même étant une option ?!

+0

Peut-être que l'Union a besoin de .First(). Êtes-vous sûr qu'aucune de ces listes n'est vide? – simendsjo

+1

En aparté - notez que 'Union' n'est pas tout à fait la même chose que" Je les veux tous en ... "- vous pourriez vouloir dire" Concat ". –

Répondre

1

Je propose:

var list = dogs.Select(d => (NameColor)d) 
       .Union(cats.Select(c => (NameColor)c)) 
       .Union(horses.Select(h => (NameColor)h)); 
+0

Je me demande si 'Enumerable.Cast()' fonctionnerait avec les conversions. Edit: source vérifiée et réalisé, il ne le ferait pas car il fait simplement un moulage 'as' de' IEnumerable'. –

3

first est le paramètre implicite "this" de Enumerable.Union. Il émet une exception car le résultat de l'opérateur as est null.

Fondamentalement, le problème est que d'avoir un opérateur de conversion pour Dogne signifie que vous pouvez traiter un IEnumerable<Dog> comme IEnumerable<NameColor>. Utilisez plutôt Select, essentiellement.

Il y a en fait deux raisons de votre conversion ne fonctionne pas:

  • as ne s'applique pas les conversions de toute façon, donc si vous faites:

    NameColor nameColor = dog as NameColor; 
    

    qui resterait encore nameColor comme nulle.

  • Juste parce qu'il ya une conversion entre les types élément ne signifie pas que la conversion est appliquée à la collection typeseux-mêmes. La variance générique ne fonctionne que pour les conversions de type référence, qui sont préservant la représentation.

+0

+1 Merci pour l'explication :) – Jimbo