¿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>?

Respuestas a la pregunta(6)

Su respuesta a la pregunta