示例#1
0
        static void Main(string[] args)
        {
            Console.WriteLine("=========Contra-Covariance:Variaveis_List============");

            // Compatibilidade da atribuição.
            string str = "teste";
            // Um objeto de um tipo mais derivado é atribuído a um objeto de um tipo menos derivado.
            object obj = str;

            Console.WriteLine("obj=" + obj);
            Console.WriteLine("str=" + str);

            // Covariância.
            IEnumerable <string> strings = new List <string>();

            Console.WriteLine("strings=" + strings.GetType());
            // Um objeto que é instanciado com um argumento de tipo mais derivado
            // é atribuído a um objeto instanciado com um argumento de tipo menos derivado.
            // A compatibilidade da atribuição é preservada.
            IEnumerable <object> objetos = strings;

            Console.WriteLine("strings=" + strings.GetType());
            Console.WriteLine("objetos=" + objetos.GetType());

            // Covariância. Um delegado especifica um tipo de retorno como objeto,
            // mas você pode atribuir um método que retorna uma string.
            Func <object> del = GetString;

            Console.WriteLine("=========Contra-Covariance:Action============");

            // Contravariância.
            // Suponha que o seguinte método esteja na classe:
            // static void SetObject(object o) { }
            // Um delegado especifica um tipo de parâmetro como sequência,
            // mas você pode atribuir um método que pega um objeto.
            Action <string> del2 = SetObject;

            Action <object> actObject = SetObject;

            Console.WriteLine("actObject=" + actObject.GetType());
            // Um objeto que é instanciado com um argumento de tipo menos derivado
            // é atribuído a um objeto instanciado com um argumento de tipo mais derivado.
            // A compatibilidade da atribuição é revertida.
            Action <string> actString = actObject;

            Console.WriteLine("actObject=" + actObject.GetType());
            Console.WriteLine("actString=" + actString.GetType());

            Console.WriteLine("=========Contra-Covariance:Delegates============");

            //Covariance
            CovarianceHandle covarianca = CovarianceMethod;

            covarianca();

            ContravarianceHandle contra_varianca = ContravarianceMethod;
            Child child = new Child();

            //Contravariance
            contra_varianca(child);


            Console.WriteLine("=========Contra-Covariance:Func============");
            Test_Contravarianca();

            Test_Covarianca();

            Console.WriteLine("=========A covariância para matrizes ============");

            object[] array = new String[10];
            // The following statement produces a run-time exception.
            //System.ArrayTypeMismatchException: 'Tentativa de acesso a
            //um elemento como um tipo incompatível com a matriz.'
            //array[0] = 10;

            Console.ReadKey();
        }
        static void Run(string[] args)
        {
            CovarianceHandle del = CovarianceMethod;

            del();
        }