Title: Covariance and Contravariance in C#3
Date: 2009-03-09 21:19:51

A short introduction to Covariance and Contravariance in *C# 3* preparing
you to an article about that in *C# 4*. So what is covariance?
Covariance is basically using a method which returns something derived
from the expected type. An exemple? It's safe to have a method
returning a cat when you expect it to return an animal. In C sharp it's

    :::csharp
    public class Animal
    {
    }

    public class Cat : Animal
    {
    }

    public class Dog : Animal
    {
    }

    // It's safe to say that something returns a Animal when in fact this thing returns a Cat
    class Covariance
    {
        void test()
        {
            Func a = Method; // OK
            Func b = delegate { return new Cat(); }; // OK
            Func c = () => new Cat(); // OK
        }

        Cat Method()
        {
            return new Cat();
        }
    }

So Funcs `a`, `b`, and `c` are returning animals which in fact are
cats, which is true. And, what is contravariance? Contravariance is
basically using a method which takes something which is a parent of
the expected type.  An exemple? It's safe to give a method an animal
when it expects to receive a cat.

    :::csharp
    // It's safe to say that something can take a Cat if in fact this thing can take any Animal
    class Contravariance
    {
        static void test()
        {
            Action a = Method; // OK
            Action b = delegate(Animal value) { }; // ERROR
            // From C#3 Specification :
            // $7.14.1 Anonymous function signatures :
            // [...] contra-variance of anonymous function parameter types is not supported.
            Action d = (Animal value) => { }; // idem... anonymous... not supported.
        }

        public static void Method(Animal value)
        {
        }
    }

So `Action` `a` take `Cats`, but in fact can take any `Animals`, so it's safe.
