Подтвердить что ты не робот

Может ли метод С# вернуть метод?

Может ли метод в С# возвращать метод?

Метод может возвращать lambda expression, но я не знаю, какой тип параметра я могу дать такому методу, потому что метод не Type. Такой возвращаемый метод может быть назначен определенному делегату.

Рассмотрим это понятие как пример:

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);
4b9b3361

Ответ 1

Типы, которые вы ищете, это Action<> или Func<>.

Общие параметры для обоих типов определяют сигнатуру типа метода. Если ваш метод не имеет возвращаемого значения, используйте Action. Если у него есть возвращаемое значение, используйте Func, где последним общим параметром является тип возврата.

Например:

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>

Ответ 2

public Func<float, float> QuadraticFunctionMake(float a, float b, float c) {
    return x => a * x * x + b * x + c;
}

Возвращаемый тип Func<float, float>.

Ответ 3

<unknown type>= Function. То есть

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

Это то, что вы ищете, так как вы уже объявили делегата Function для соответствия. Кроме того, вам не нужно вообще объявлять делегат и использовать Func<float, Float>, как это заметили другие. Это точно эквивалентно. Фактически, Func<T, T> объявляется точно так же, как ваш делегат Function, за исключением того, что его общий.

Ответ 4

Ваши лямбда-выражения возьмут float как параметр (я полагаю), а затем верну его float. В .NET мы можем представить это по типу Func<float, float>.

Как правило, если вы имеете дело с lambdas, которые принимают больше параметров, вы можете использовать Func<Type1, Type2, Type3, ..., ReturnType> с до восьми параметров.

Ответ 5

Я думаю, вам нужно определение делегата Action <T> . Я надеюсь, что статья Действие <T> Делегат может помочь вам.