2010-01-14 9 views
7

Je suis un peu confus au sujet de ce qui suit.C# .net coulée question

Compte tenu de cette classe:

public class SomeClassToBeCasted 
    { 
     public static implicit operator string(SomeClassToBeCasted rightSide) 
     { 
      return rightSide.ToString(); 
     } 
    } 

Pourquoi un InvalidCastException Renvoyé lorsque je tente de faire ce qui suit?

IList<SomeClassToBeCasted> someClassToBeCastedList 
    = new List<SomeClassToBeCasted> {new SomeClassToBeCasted()}; 
IEnumerable<string> results = someClassToBeCastedList.Cast<string>(); 

foreach (var item in results) 
{ 
    Console.WriteLine(item.GetType()); 
} 

Répondre

16

Parce que Cast() ne traite pas des moulages spécifiés par l'utilisateur - seules les conversions de référence (à savoir le type normal de la conversion d'une référence ou en bas de la hiérarchie d'héritage) et les conversions de boxe/unboxing. Ce n'est pas la même chose que ce qu'un casting va faire dans le code source. Malheureusement, ce n'est pas clairement documenté :(

EDIT: Juste pour faire le commentaire de Jason dans le poste, vous pouvez contourner ce facilement avec une projection:

IEnumerable<string> results = originalList.Select(x => (string) x); 
+3

Et, pour ajouter, vous pouvez obtenir "autour" avec ce 'IEnumerable résultats = someClassToBeCastedList.Select (x => (string) x)' – jason

6

Si nécessaire uniquement pour les listes, vous pouvez faire

IEnumerable<string> results = 
     someClassToBeCastedList.Select(itm => itm.ToString()); 

à la place.

+1

Cela ne même pas utiliser la distribution définie par l'utilisateur l'OP défini. – jason

+0

Oui, c'est ce que je voulais dire à propos des listes. Cela dépend si cette fonctionnalité d'opérateur de distribution est également nécessaire dans d'autres endroits. – herzmeister

-1

vous pouvez utiliser ce que je GOT le même problème, il vous aide

IEnumerable results = originalList.Select (x => (chaîne) x);