web-dev-qa-db-fra.com

Une méthode C # peut-elle renvoyer une méthode?

Une méthode en C # peut-elle renvoyer une méthode?

Une méthode pourrait renvoyer un expression lambda par exemple, mais je ne sais pas quel type de paramètre de type puis-je donner à une telle méthode, car une méthode n'est pas Type. Une telle méthode retournée pourrait être assignée à un délégué.

Considérez ce concept comme un exemple:

public <unknown type> QuadraticFunctionMaker(float a , float b , float c)
{
    return (x) => { return a * x * x  + b * x + c; };
}

delegate float Function(float x);
Function QuadraticFunction = QuadraticFunctionMaker(1f,4f,3f);
35
kr85

Les types que vous recherchez sont Action<> ou Func<>.

Les paramètres génériques sur les deux types déterminent la signature de type de la méthode. Si votre méthode n'a pas de valeur de retour, utilisez Action. S'il a une valeur de retour, utilisez Func où le dernier paramètre générique est le type de retour.

Par exemple:

public void DoSomething()                          // Action
public void DoSomething(int number)                // Action<int>
public void DoSomething(int number, string text)   // Action<int,string>

public int DoSomething()                           // Func<int>
public int DoSomething(float number)               // Func<float,int>
public int DoSomething(float number, string text)  // Func<float,string,int>
39
Zebi
public Func<float, float> QuadraticFunctionMake(float a, float b, float c) {
    return x => a * x * x + b * x + c;
}

Le type de retour est Func<float, float>.

21
siride

<unknown type> = Function. C'est,

public Function QuadraticFunctionMaker(float a , float b , float c)
{
    return (x) => { return a * x * x  + b * x + c; };
}

C'est ce que vous recherchez, car vous avez déjà déclaré le délégué Function correspondant. Alternativement, vous n'avez pas du tout besoin de déclarer un délégué et vous pouvez utiliser Func<float, Float> comme d'autres l'ont remarqué. C'est exactement équivalent. En réalité, Func<T, T> est déclaré exactement de la même manière que votre délégué Function sauf qu'il est générique.

2
Konrad Rudolph

Vos expressions lambda prendraient un float comme paramètre (je crois), puis renverraient également un float. Dans . NET , nous pouvons représenter cela par le type Func<float, float>.

En général, si vous traitez des lambdas qui prennent plus de paramètres, vous pouvez utiliser Func<Type1, Type2, Type3, ..., ReturnType>, avec jusqu'à huit paramètres.

0