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(); } }