¿Por qué List <int> no es IEnumerable <ValueType>?
[Editar: Mis disculpas ... la redacción original de la pregunta era ambigua y no recibía las respuestas que estaba buscando]
Para cualquier clase X que herede de la clase Y,new List<X>() is IEnumerable<Y>
es verdad. Sin embargo, esto no es válido para estructuras:new List<int>() is IEnumerable<ValueType>
Es falso. Mi pregunta es: ¿por qué?
Aquí hay un programa de muestra:
class Program
{
class Y { }
class X : Y { }
struct Z { }
static void Main(string[] args)
{
Test(new List<X>());
Test(new List<string>());
Test(new List<Z>());
Test(new List<int>());
Test("blah");
Test(1);
Console.ReadLine();
}
static void Test(object o)
{
if (o is IEnumerable<Y>)
{
Console.WriteLine(o + " is a list of Ys");
}
else if (o is IEnumerable<ValueType>)
{
Console.WriteLine(o + " is a list of ValueTypes");
}
else if (o is IEnumerable<object>)
{
Console.WriteLine(o + " is a list of objects");
}
else if (o is System.Collections.IEnumerable)
{
Console.WriteLine(o + " is most likely a list of ValueTypes or a string");
}
else
{
Console.WriteLine(o + " is not a list");
}
}
}
Salida
System.Collections.Generic.List`1 [ConsoleApplication1.Program + X] es una lista de Ys
System.Collections.Generic.List`1 [System.String] es una lista de objetos
System.Collections.Generic.List`1 [ConsoleApplication1.Program + Z] es muy probablemente una lista de ValueTypes o una cadena
System.Collections.Generic.List`1 [System.Int32] es muy probablemente una lista de ValueTypes o una cadena
s muy probable que @blah sea una lista de ValueTypes o una cadena
1 no es una lista
Entonces, ¿por qué esnew List<int>
No unIEnumerable<ValueType>
?