Leer en inglés

Compartir a través de


Func<T,TResult> Delegado

Definición

Encapsula un método que tiene un parámetro y devuelve un valor del tipo especificado por el parámetro TResult.

C#
public delegate TResult Func<in T,out TResult>(T arg);
C#
public delegate TResult Func<T,TResult>(T arg);

Parámetros de tipo

T

Tipo de parámetro del método que este delegado encapsula.

Este parámetro de tipo es contravariante, es decir, puede usar el tipo que haya especificado o cualquier tipo menos derivado. Si desea obtener más información sobre la covarianza y la contravarianza, consulte Covarianza y contravarianza en genéricos.
TResult

Tipo del valor devuelto del método que este delegado encapsula.

Este parámetro de tipo es covariante, es decir, puede usar el tipo que haya especificado o cualquier tipo más derivado. Si desea obtener más información sobre la covarianza y la contravarianza, consulte Covarianza y contravarianza en genéricos.

Parámetros

arg
T

Parámetro del método que este delegado encapsula.

Valor devuelto

TResult

Valor devuelto del método que este delegado encapsula.

Ejemplos

En el ejemplo siguiente se muestra cómo declarar y usar un Func<T,TResult> delegado. En este ejemplo se declara una variable y se le asigna una expresión lambda que convierte los caracteres Func<T,TResult> de una cadena a mayúsculas. El delegado que encapsula este método se pasa posteriormente al método para cambiar las cadenas de una matriz de Enumerable.Select cadenas a mayúsculas.

C#
// Declare a Func variable and assign a lambda expression to the
// variable. The method takes a string and converts it to uppercase.
Func<string, string> selector = str => str.ToUpper();

// Create an array of strings.
string[] words = { "orange", "apple", "Article", "elephant" };
// Query the array and select strings according to the selector method.
IEnumerable<String> aWords = words.Select(selector);

// Output the results to the console.
foreach (String word in aWords)
    Console.WriteLine(word);

/*
This code example produces the following output:

ORANGE
APPLE
ARTICLE
ELEPHANT

*/

Comentarios

Puede usar este delegado para representar un método que se puede pasar como parámetro sin declarar explícitamente un delegado personalizado. El método encapsulado debe corresponder a la firma del método definida por este delegado. Esto significa que el método encapsulado debe tener un parámetro que se le pase por valor y que debe devolver un valor.

Nota

Para hacer referencia a un método que tiene un parámetro y devuelve (o en Visual Basic, que se declara como en lugar de como ), use el delegado genérico en void Sub su Function Action<T> lugar.

Cuando se usa el delegado, no es necesario definir explícitamente un delegado que encapsula un Func<T,TResult> método con un solo parámetro. Por ejemplo, el código siguiente declara explícitamente un delegado denominado y asigna una referencia ConvertMethod al método a su instancia de UppercaseString delegado.

C#
using System;

delegate string ConvertMethod(string inString);

public class DelegateExample
{
   public static void Main()
   {
      // Instantiate delegate to reference UppercaseString method
      ConvertMethod convertMeth = UppercaseString;
      string name = "Dakota";
      // Use delegate instance to call UppercaseString method
      Console.WriteLine(convertMeth(name));
   }

   private static string UppercaseString(string inputString)
   {
      return inputString.ToUpper();
   }
}

En el ejemplo siguiente se simplifica este código mediante la creación de instancias del delegado en lugar de definir explícitamente un nuevo delegado y asignarle un Func<T,TResult> método con nombre.

C#
// Instantiate delegate to reference UppercaseString method
Func<string, string> convertMethod = UppercaseString;
string name = "Dakota";
// Use delegate instance to call UppercaseString method
Console.WriteLine(convertMethod(name));

string UppercaseString(string inputString)
{
   return inputString.ToUpper();
}

// This code example produces the following output:
//
//    DAKOTA

También puede usar el delegado Func<T,TResult> con métodos anónimos en C#, como se muestra en el ejemplo siguiente. (Para obtener una introducción a los métodos anónimos, vea Métodos anónimos).

C#
 Func<string, string> convert = delegate(string s)
    { return s.ToUpper();};

 string name = "Dakota";
 Console.WriteLine(convert(name));

// This code example produces the following output:
//
//    DAKOTA

También puede asignar una expresión lambda a un Func<T,TResult> delegado, como se muestra en el ejemplo siguiente. (Para obtener una introducción a las expresiones lambda, vea Expresiones lambda (VB), Expresiones lambda (C#) y Expresiones lambda (F#).

C#
Func<string, string> convert = s => s.ToUpper();

string name = "Dakota";
Console.WriteLine(convert(name));

// This code example produces the following output:
//
//    DAKOTA

El tipo subyacente de una expresión lambda es uno de los Func delegados genéricos. Esto permite pasar una expresión lambda como parámetro sin asignarla explícitamente a un delegado. En concreto, dado que muchos métodos de tipos del espacio de nombres tienen parámetros, puede pasar a estos métodos una expresión lambda sin crear explícitamente System.Linq Func<T,TResult> instancias de un Func<T,TResult> delegado.

Métodos de extensión

GetMethodInfo(Delegate)

Obtiene un objeto que representa el método representado por el delegado especificado.

Se aplica a

Producto Versiones
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7
.NET Framework 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

Consulte también