es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

No se puede asignar un delegado con un parámetro de tipo más derivado a un delegado con un parámetro de tipo menos derivado – Delegados Genéricos

Estoy tratando de entender la contravarianza en los delegados genéricos. En el siguiente código, puedo asignar el delegado sgd1 a sgd2 (covarianza). A pesar de que el parámetro de tipo de sgd4 es de tipo base del parámetro de tipo de sgd3, ¿por qué no puedo asignar sgd3 a sgd4 (contravarianza)?

 class Program
        {
            public delegate R SampleGenericDelegate<in A, out R>(A a);  
            static void Main(string[] args)
            {
                SampleGenericDelegate<string, string> sgd1= TakesObjectReturnsString;   
                SampleGenericDelegate<string, object> sgd2= sgd1;    //Delegado con un tipo de retorno de tipo base
                SampleGenericDelegate<string, string> sgd3= TakesObjectReturnsString;    
                SampleGenericDelegate<object, string> sgd4= sgd3;   //Delegado con un parámetro de tipo de tipo base   // arroja un error                 
            }
            public static string TakesObjectReturnsString(object s)
            {
                return "";
            }
        }
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    La contravarianza es la capacidad de un delegado para aceptar argumentos de un tipo menos derivado (más base) que el especificado por el parámetro de tipo de delegado. En el código proporcionado, tenemos un delegado SampleGenericDelegate con un parámetro de tipo de entrada de ‘in A’ y un parámetro de tipo de salida de ‘out R’.

    En la línea 7, sgd1 se asigna a TakesObjectReturnsString, que tiene un parámetro de entrada de objeto, un tipo menos derivado que string. Esto es posible debido a la contravarianza.

    En la línea 8, sgd2 se asigna a sgd1, lo cual es posible porque el parámetro de tipo de salida de sgd2, ‘out R’, es menos restrictivo que el parámetro de tipo de salida de sgd1, string. Esto es covarianza.

    En la línea 9, sgd3 se asigna a TakesObjectReturnsString. Esto es esencialmente lo mismo que en la línea 7.

    Sin embargo, en la línea 10, sgd4 se asigna a sgd3, pero esto no es posible ya que el parámetro de tipo de entrada de sgd3, string, no es menos derivado que el parámetro de tipo de entrada de sgd4, objeto. Esto significa que la contravarianza no se aplica aquí. Por lo tanto, sgd3 no se puede asignar a sgd4.

Comments are closed.