public void EjemplosDelegadosLambda()
        {
            DelegadosEjemploSystemDefined ejemplo = new DelegadosEjemploSystemDefined();//se hace un objeto de la clase.
            ejemplo.M1 = (int primer, int seg) => primer + seg;//lambda entre parentesis, los parametros, la flechita equivale al return, despues esta el cuerpo del metodo.//una metodo que se guarda en M1 y este a su vez es la firma.

            ejemplo.M2 = (string uno, string dos) => uno + dos;
            ejemplo.M3 = x => ImprimirEnConsola(x);//cuando es un solo parametro se pueden omitir los parentesis y el tipo de dato, en este caso, el cuerpo del metodo es un metodo que cumple con la firma y se guarda en M3 que es la variable de tipo delegado.

            int resultadoSuma = ejemplo.M1(10, 12);//se pasan los valores a la variable de tipo delegado.
            string resultString = ejemplo.M2("jonas", "nahum");//se pasan los valores a la variable de tipo delegado.
            ejemplo.M3("Hola");//se pasan los valores a la variable de tipo delegado.

            Assert.AreEqual(22, resultadoSuma);
            Assert.AreEqual("jonasnahum", resultString);
        }
        public void EjemplosDelegadosSystemDefined()
        {
            //las variables de tipo delegado guardan la implementacion del metodo que cumple con la firma.
            int Z = 1;//esta variable puede ser llamada dentro de un metodo, pero no alrevez, mas adelante, cambia su valor, y por lo tanto, no afecta el metodo en donde se usa.
            DelegadosEjemploSystemDefined ejemplo = new DelegadosEjemploSystemDefined();//un objeto de la clase.
            ejemplo.M1 = delegate(int x, int y) //estos son los parametros.//variable de tipo delegado M1//se pasa el metodo que va a guardar M1// delegate suple al nombre del metodo, este es un delegado anonimo, no tiene nombre, y hace su implementacion.
            {
                return (x + y) - Z;//este es el cuerpo del metodo
            };
            ejemplo.M2 = delegate(string a, string b)//variable de tipo delegado M2//aqui es un metodo declarado inline, adem[as es un metodo anonimo.cumple con el delegado de M2.
            {
                return a + b;
            };//lleva ; porque es una sola linea toda la implementacion.
            ejemplo.M3 = ImprimirEnConsola;//variable de tipo delegado  M3.sin parentesis se pasa el metodo porque es variable.
            Z = 0;//variales capture,..

            int resultadoSuma = ejemplo.M1(10, 12);//se pasan los valores a la variable de tipo delegado que a su vez, se va a guardar en M1.
            string resultString = ejemplo.M2("jonas", "nahum");//se pasan los valores a la variable de tipo delegado que se va a guardar en M2.
            ejemplo.M3("Hola");

            Assert.AreEqual(22, resultadoSuma);
            Assert.AreEqual("jonasnahum", resultString);
        }