In .net 2.0, A delegate can be associated with a named method, this facility provide support for covariant and contravariant as the following sample code shows.

        delegate void ProcessString(string item);
        delegate object GetObject();

        void RunObject(object item)
        {
            Console.WriteLine(item);
        }

        string RetrieveString()
        {
            return string.Empty;
        }

        [TestMethod]
        public void delegate_shortcut_suport_contraVariant()
        {
            //delegate with derived type parameter input <--(accept) method with base type parameter input
            ProcessString processString = this.RunObject;
            processString("string");
            //-->
            RunObject("string");
        }

        [TestMethod]
        public void delegate_shortcut_support_coVariant()
        {
            //delegate with base type output <--(accept) method with derived type output 
            GetObject getObject = this.RetrieveString;
            object returnValue = getObject();
            //-->
            object returnValue2 = this.RetrieveString();
        }