static void CovarianceDemo1()
        {
            var ls = new List <Sub>();
            var lb = new List <Base>();


            var b = new Base();
            var s = new Sub();

            ls.Add(s);
            lb.Add(b);

            // ls.Add(b); error
            lb.Add(s);

            DoSomething(ls);
            // DoSomething2(ls); error

            var fooin  = new FooIn <Sub>();
            var fooout = new FooOut <Sub>();

            IFooIn <Sub> returnValueIn = GetFooIn();

            //IFooOut<Sub> returnValueOut = GetFooOut();

            // GetFooIn(fooin); illeagal due to covariance rules
            GetFooOut(fooout); // legal due to covariance rules
        }
 static IFooIn <Base> GetFooIn(IFooIn <Base> f = null)
 {
     return(null);
 }