Perdón por el título torpe, pero SO no me permitió dejarlo en "la conversión implícita no funciona como se esperaba".
Considere este tipo genérico trivial:
public class Foo<T> { public T Bar; public Foo(T bar) => Bar = bar; public static implicit operator Foo<T>(T bar) => new(bar); } Observe la conversión implícita que (al menos en mi mente) debería permitirme crear un Foo<T> directamente desde cualquier T así:
int[] xs = new[] { 1, 2, 3 }; IEnumerable<int> ys = xs.AsEnumerable(); Foo<IEnumerable<int>> foo = ys; // CS0266Sin embargo, lo anterior producirá un error de compilación:
CS0266: No se puede convertir implícitamente el tipo 'System.Collections.Generic.IEnumerable<int>' a 'Foo<System.Collections.Generic.IEnumerable<int>>'. Existe una conversión explícita (¿falta un reparto?)
Curiosamente, el siguiente código funciona sin problemas:
int[] xs = new[] { 1, 2, 3 }; Foo<IEnumerable<int>> foo = xs; // no errorY el uso de una conversión explícita "arregla" el error del compilador, pero falla en el tiempo de ejecución:
int[] xs = new[] { 1, 2, 3 }; IEnumerable<int> ys = xs.AsEnumerable(); Foo<IEnumerable<int>> foo = (Foo<IEnumerable<int>>)ys; // InvalidCastExceptionInvalidCastException: no se puede convertir el objeto de tipo 'System.Int32[]' para escribir 'Foo`1[System.Collections.Generic.IEnumerable`1[System.Int32]]'.
¿Que esta pasando aqui? Estoy totalmente perplejo y no tengo la menor idea.
Violín .NET: https://dotnetfiddle.net/wNHUtl