web-dev-qa-db-ja.com

C#メソッドはメソッドを返すことができますか?

C#のメソッドはメソッドを返すことができますか?

たとえば、メソッドは ラムダ式 を返す可能性がありますが、メソッドが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);
35
kr85

あなたが探しているタイプは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>
39
Zebi
public Func<float, float> QuadraticFunctionMake(float a, float b, float c) {
    return x => a * x * x + b * x + c;
}

戻り値の型はFunc<float, float>

21
siride

<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とまったく同じ方法で宣言されます。

2
Konrad Rudolph

あなたのラムダ式はfloatをパラメーターとして受け取り(私はそう思います)、次にfloatも返します。 。NET では、タイプFunc<float, float>でこれを表すことができます。

一般に、より多くのパラメーターをとるラムダを扱う場合は、最大8つのパラメーターを持つFunc<Type1, Type2, Type3, ..., ReturnType>を使用できます。