2010-01-14 15 views
7

Estoy un poco confundido acerca de lo siguiente.C# .net casting pregunta

Teniendo en cuenta esta clase:

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

¿Por qué se produce una InvalidCastException cuando trato de hacer lo siguiente?

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

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

Respuesta

16

Debido Cast() no se ocupa de moldes especificados por el usuario - sólo conversiones de referencia (es decir, el tipo normal de conversión de una referencia arriba o hacia abajo la jerarquía de herencia) y conversiones unboxing de boxeo /. No es lo mismo que lo que hará un elenco en el código fuente. Desafortunadamente esto no está claramente documentada :(

EDIT: sólo para llevar el comentario de Jason en el puesto, puede solucionar esto fácilmente con una proyección:

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

Y, para añadir, puede obtener "alrededor" esto con 'IEnumerable resultados = someClassToBeCastedList.Select (x => (cuerda) x);' – jason

6

Si tan sólo es necesario para las listas, puede hacerlo

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

lugar.

+1

Esto ni siquiera utiliza el molde definido por el usuario el OP definido – jason

+0

Sí, eso es lo que quise decir sobre las listas. Depende de si la funcionalidad del operador de transmisión también se necesita en otros lugares. – herzmeister

-1

puede utilizar esta i tengo problema similar al que le ayuda a

IEnumerable results = originalList.Select (x => (cadena) x);