サーチ…


構文

  • 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)

パラメーター

パラメータ詳細
argまたはarg1 メソッドの(最初の)パラメータ
arg2 メソッドの2番目のパラメータ
arg3 メソッドの3番目のパラメータ
arg4 メソッドの4番目のパラメータ
TまたはT1 メソッドの(最初の)パラメータの型。
T2 メソッドの第2パラメータの型
T3 メソッドの3番目のパラメータの型
T4 メソッドの第4パラメータの型
TResult メソッドの戻り値の型

パラメータなし

この例は、現在時刻を返すメソッドをカプセル化するデリゲートを作成する方法を示しています

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();
}

複数の変数

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);
}

ラムダ&匿名メソッド

デリゲートが必要な場合は、匿名メソッドを割り当てることができます。

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

ラムダ式を使って同じことを表現することができます:

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

どちらの場合でも、 square内部に格納されたメソッドを次のように呼び出すことができます:

var sq = square.Invoke(2);

または省略形として:

var sq = square(2);

代入が型安全であるためには、匿名メソッドのパラメータ型と戻り値の型が委譲型の型と一致しなければならないことに注意してください。

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

共変変数および反変量パラメータ

Funcまた、 共変および逆変換をサポートします

// 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
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow