Duplicar posible:
Puzzling Enumerable.Cast InvalidCastExceptionEnumerable.Cast <T> método de extensión falla al lanzar desde int a long, ¿por qué?
Hola,
acabo de notar algo muy extraño con el método de extensión Enumerable.Cast<T>
... Parece que no puede lanzar desde int
a long
, a pesar de que este elenco es perfectamente legal.
El siguiente código falla con un InvalidCastException
:
foreach (var item in Enumerable.Range(0,10).Cast<long>())
{
Console.WriteLine(item);
}
Pero este código, que se presume equivalente, no trabajo:
foreach (var item in Enumerable.Range(0,10).Select(i => (long)i))
{
Console.WriteLine(item);
}
Puede alguien explicar ese comportamiento? Miré el código del método moldeada con reflector, pero no puedo interpretar Reflector bloques de iterador, así que es bastante difícil de entender ...
duplicado posible: http://stackoverflow.com/questions/445471 –
sí, usted' Re correcto ... Lo extrañé en mi búsqueda –
Me sorprende que ninguna de las respuestas realmente responda la pregunta * por qué *. La respuesta es porque la conversión de int a long ** no es un elenco **. Es una * conversión *. Es desafortunado que C# use la misma sintaxis para ambos, ya que solo confunde a las personas (aparentemente). Tampoco puede usar '.Cast()' para invocar a un operador de conversión explícita personalizado porque tampoco es un elenco. –
Timwi