Buscar..


Sintaxis

  • public delegate TResult Func<in T, out TResult>(T arg)
  • public delegate TResult Func<in T1, in T2, out TResult>(T1 arg1, T2 arg2)
  • public delegate TResult Func<in T1, in T2, in T3, out TResult>(T1 arg1, T2 arg2, T3 arg3)
  • public delegate TResult Func<in T1, in T2, in T3, in T4, out TResult>(T1 arg1, T2 arg2, T3 arg3, T4 arg4)

Parámetros

Parámetro Detalles
arg o arg1 el (primer) parámetro del método
arg2 El segundo parámetro del método.
arg3 El tercer parámetro del método.
arg4 El cuarto parámetro del método.
T o T1 El tipo del (primer) parámetro del método.
T2 El tipo del segundo parámetro del método.
T3 El tipo del tercer parámetro del método.
T4 El tipo del cuarto parámetro del método.
TResult el tipo de retorno del método

Sin parametros

Este ejemplo muestra cómo crear un delegado que encapsula el método que devuelve la hora actual

static DateTime UTCNow()
{
    return DateTime.UtcNow;
}

static DateTime LocalNow()
{
    return DateTime.Now;
}

static void Main(string[] args)
{
    Func<DateTime> method = UTCNow;
    // method points to the UTCNow method
    // that retuns current UTC time  
    DateTime utcNow = method();

    method = LocalNow;
    // now method points to the LocalNow method
    // that returns local time

    DateTime localNow = method();
}

Con multiples variables

static int Sum(int a, int b)
{
    return a + b;
}

static int Multiplication(int a, int b)
{
    return a * b;
}

static void Main(string[] args)
{
    Func<int, int, int> method = Sum;
    // method points to the Sum method
    // that retuns 1 int variable and takes 2 int variables  
    int sum = method(1, 1);

    method = Multiplication;
    // now method points to the Multiplication method

    int multiplication = method(1, 1);
}

Lambda y métodos anónimos

Se puede asignar un método anónimo donde se espera un delegado:

Func<int, int> square = delegate (int x) { return x * x; }

Las expresiones Lambda se pueden usar para expresar lo mismo:

Func<int, int> square = x => x * x;

En cualquier caso, ahora podemos invocar el método almacenado dentro de un square como este:

var sq = square.Invoke(2);

O como una taquigrafía:

var sq = square(2);

Observe que para que la asignación sea segura para el tipo, los tipos de parámetros y el tipo de retorno del método anónimo deben coincidir con los del tipo delegado:

Func<int, int> sum = delegate (int x, int y) { return x + y; } // error
Func<int, int> sum = (x, y) => x + y; // error

Parámetros de Tipo Covariante y Contravariante

Func también soporta Covariant & Contravariant

// Simple hierarchy of classes.
public class Person { }
public class Employee : Person { }

class Program
{
    static Employee FindByTitle(String title)
    {
        // This is a stub for a method that returns
        // an employee that has the specified title.
        return new Employee();
    }

    static void Test()
    {
        // Create an instance of the delegate without using variance.
        Func<String, Employee> findEmployee = FindByTitle;

        // The delegate expects a method to return Person,
        // but you can assign it a method that returns Employee.
        Func<String, Person> findPerson = FindByTitle;

        // You can also assign a delegate 
        // that returns a more derived type 
        // to a delegate that returns a less derived type.
        findPerson = findEmployee;

    }
}


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow