Tengo un tipo con la conversión implícita a los operadores de la mayoría de los tipos de base, y trató de utilizar .Cast<string>() en una colección de este tipo, que fracasó. Como me clavaron en ella, me di cuenta de que la conversión a través de as no utilizar la conversión implícita o explícita y no compilar, así que supongo que es donde .Cast cae. Así que esta falla

var enumerable = source.Cast<string>();

pero esto funciona

var enumerable = source.Select(x => (string)x);

¿Cuál es el beneficio de Yeso? Claro, es un par de personajes más corto, pero parece mucho más limitada. Si puede ser utilizado para la conversión, ¿hay algún beneficio que no sea el más compacto de la sintaxis?

2 Comentarios

  1. 43

    Elenco de uso

    El beneficio de Cast viene cuando tu colección sólo implementa IEnumerable (es decir. no la versión genérica). En este caso, Cast convierte todos los elementos para TResult por fundición, y devuelve IEnumerable<TResult>. Esto es muy práctico, porque todos los otros métodos de extensión de LINQ (incluyendo Select) es sólo declaró para IEnumerable<T>. En el código, se parece a esto:

    IEnumerable source = //getting IEnumerable from somewhere
    
    //Compile error, because Select is not defined for IEnumerable.
    var results = source.Select(x => ((string)x).ToLower());
    
    //This works, because Cast returns IEnumerable<string>
    var results = source.Cast<string>().Select(x => x.ToLower());

    Cast y OfType son los únicos dos métodos de extensión de LINQ que se definen para IEnumerable. OfType funciona como Cast, pero omite elementos que no son de tipo TResult en lugar de lanzar una excepción.

    De fundición y las conversiones implícitas

    La razón por la que su conversión implícita operador no funciona cuando se utiliza Cast es simple: Cast arroja object a TResult – y su conversión no está definida para object, sólo para su tipo específico. La aplicación para Cast es algo como esto:

    foreach (object obj in source)
        yield return (TResult) obj;

    Este «fracaso» de yeso para hacer la conversión corresponde a la base de reglas de conversión – como se ve por este ejemplo:

    YourType x = new YourType(); //assume YourType defines an implicit conversion to string
    object   o = x;
    
    string bar = (string)x;      //Works, the implicit operator is hit.
    string foo = (string)o;      //Fails, no implicit conversion between object and string
    • ¿Cuál es la sintaxis de la consulta de la versión de source.Cast<string>().Select(..)?
    • Necroing el hilo pero no hay sintaxis de la consulta equivalente. Sin embargo, usted puede utilizar dentro de una sintaxis de la consulta de expresión. Suponiendo myEnumerable es IEnumerable y no IEnumerabl<T> puede utilizar from x in myEnumerable.Cast<Dog>() select x
  2. 5

    He comprobado el Página de MSDN para Cast<TResult>, y es un método de extensión a los tipos que implementan (no genérica) IEnumerable interfaz.

    Puede convertir una clase de colección (como ArrayList) que no implementa IEnumerable<T> a uno que hace, que permite la más rica de las operaciones (tales como Select<T>) a realizarse en contra de ella.

Dejar respuesta

Please enter your comment!
Please enter your name here