¿Cómo es la covarianza más fría que el polimorfismo ... y no es redundante?

.NET 4 introduce covarianza. Supongo que es útil. Después de todo, MS pasó por todo el problema de agregarlo al lenguaje C #. Pero, ¿por qué la covarianza es más útil que un buen polimorfismo?

Escribí este ejemplo para entender por qué debería implementar Covarianza, pero aún no lo entiendo. Por favor iluminame.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Sample
{
    class Demo
    {
        public delegate void ContraAction<in T>(T a);

        public interface IContainer<out T>
        {
            T GetItem();
            void Do(ContraAction<T> action);
        }

        public class Container<T> : IContainer<T>
        {
            private T item;

            public Container(T item)
            {
                this.item = item;
            }

            public T GetItem()
            {
                return item;
            }

            public void Do(ContraAction<T> action)
            {
                action(item);
            }
        }

        public class Shape
        {
            public void Draw()
            {
                Console.WriteLine("Shape Drawn");
            }
        }

        public class Circle:Shape
        {
            public void DrawCircle()
            {
                Console.WriteLine("Circle Drawn");
            }
        }

        public static void Main()
        {
            Circle circle = new Circle();
            IContainer<Shape> container = new Container<Circle>(circle);
            container.Do(s => s.Draw());//calls shape

            //Old school polymorphism...how is this not the same thing?
            Shape shape = new Circle();
            shape.Draw();
        }
    }
}

Respuestas a la pregunta(3)

Su respuesta a la pregunta