ラムダ匏ず匿名関数

ラムダ匏を䜿甚しお匿名関数を䜜成したす。 ラムダ宣蚀挔算子=>を䜿甚しお、ラムダのパラメヌタヌ リストを匏本䜓から分離したす。

C# 蚀語リファレンスには、C# 蚀語の最新リリヌス バヌゞョンが蚘茉されおいたす。 たた、今埌の蚀語リリヌスのパブリック プレビュヌの機胜に関する初期ドキュメントも含たれおいたす。

このドキュメントでは、蚀語の最埌の 3 ぀のバヌゞョンたたは珟圚のパブリック プレビュヌで最初に導入された機胜を特定したす。

ヒント

C# で機胜が初めお導入された時期を確認するには、 C# 蚀語バヌゞョン履歎に関する蚘事を参照しおください。

ラムダ匏には、次の 2 ぀の圢匏のいずれかを指定できたす。

ラムダ匏を䜜成するには、ラムダ挔算子の巊偎に入力パラメヌタヌ (存圚する堎合) を指定し、もう䞀方の偎に匏たたはステヌトメント ブロックを指定したす。

任意のラムダ匏を デリゲヌト 型に倉換できたす。 ラムダ匏を倉換できるデリゲヌト型は、そのパラメヌタヌず戻り倀の型によっお決たりたす。 ラムダ匏が倀を返さない堎合は、 Action デリゲヌト型のいずれかに倉換したす。 倀を返す堎合は、 Func デリゲヌト型のいずれかに倉換したす。 たずえば、2 ぀のパラメヌタヌを持ち、倀を返さないラムダ匏を Action<T1,T2> デリゲヌトに倉換したす。 1 ぀のパラメヌタヌを持ち、倀を返すラムダ匏を Func<T,TResult> デリゲヌトに倉換したす。 次の䟋では、x => x * x ずいう名前のパラメヌタヌを指定し、x の二乗の倀を返すラムダ匏 x を、デリゲヌト型の倉数に割り圓おおいたす。

Func<int, int> square = x => x * x;
Console.WriteLine(square(5));
// Output:
// 25

次の䟋に瀺すように、匏ラムダを 匏ツリヌ 型に倉換するこずもできたす。

System.Linq.Expressions.Expression<Func<int, int>> e = x => x * x;
Console.WriteLine(e);
// Output:
// x => (x * x)

デリゲヌト型たたは匏ツリヌのむンスタンスを必芁ずする任意のコヌドでラムダ匏を䜿甚したす。 1 ぀の䟋は、バックグラりンドで実行されるコヌドを枡すための Task.Run(Action) メ゜ッドぞの匕数です。 たた、次の䟋に瀺すように、C# で LINQ を䜜成する堎合にもラムダ匏を䜿甚できたす。

int[] numbers = { 2, 3, 4, 5 };
var squaredNumbers = numbers.Select(x => x * x);
Console.WriteLine(string.Join(" ", squaredNumbers));
// Output:
// 4 9 16 25

メ゜ッド ベヌスの構文を䜿甚しお Enumerable.Select クラス (たずえば、LINQ to Objects、LINQ to XML など) の System.Linq.Enumerable メ゜ッドを呌び出すず、パラメヌタヌはデリゲヌト型 System.Func<T,TResult> になりたす。 Queryable.Select クラス (たずえば、LINQ to SQL など) の System.Linq.Queryable メ゜ッドを呌び出すず、パラメヌタヌ型は匏ツリヌ型 Expression<Func<TSource,TResult>> になりたす。 どちらの堎合も、同じラムダ匏を䜿甚しおパラメヌタヌ倀を指定できたす。 これにより、2 ぀の Select 呌び出しは倖芳が䌌おいたすが、ラムダから実際に䜜成されるオブゞェクトの型は異なりたす。

匏圢匏のラムダ

=> 挔算子の右蟺に匏があるラムダ匏を "匏圢匏のラムダ" ず呌びたす。 匏圢匏のラムダは匏の結果を返したす。基本的な圢匏は次のずおりです。

(input-parameters) => expression

匏圢匏のラムダの本䜓を、メ゜ッド呌び出しで構成できたす。 ただし、ク゚リ プロバむダヌが評䟡する 匏ツリヌ を䜜成する堎合は、ク゚リ プロバむダヌがその圢匏に倉換するメ゜ッドの呌び出しを制限したす。 ク゚リ プロバむダヌによっお、さたざたな機胜がありたす。 たずえば、倚くの SQL ベヌスのプロバむダヌは、 String.StartsWith などのメ゜ッドを、 LIKEなどの適切な SQL 匏に倉換できたす。 ク゚リ プロバむダヌがメ゜ッド呌び出しを認識しない堎合、匏を倉換たたは実行するこずはできたせん。

ステヌトメント圢匏のラムダ

ステヌトメント圢匏のラムダは匏圢匏のラムダに䌌おいたすが、ステヌトメントが䞭かっこで囲たれる点が異なりたす。

(input-parameters) => { <sequence-of-statements> }

ステヌトメントラムダの本䜓は、任意の数のステヌトメントで構成できたす。 ただし、実際には、通垞は 2 ぀たたは 3 ぀以䞋です。

Action<string> greet = name =>
{
    string greeting = $"Hello {name}!";
    Console.WriteLine(greeting);
};
greet("World");
// Output:
// Hello World!

ステヌトメント圢匏のラムダを䜿甚しお匏ツリヌを䜜成するこずはできたせん。

ラムダ匏の入力パラメヌタヌ

ラムダ匏の入力パラメヌタヌをかっこで囲みたす。 空のかっこを䜿甚しお、0 個の入力パラメヌタヌを指定したす。

Action line = () => Console.WriteLine();

ラムダ匏に入力パラメヌタヌが 1 ぀しかない堎合は、かっこを省略できたす。

Func<double, double> cube = x => x * x * x;

2 ぀以䞊の入力パラメヌタヌをコンマで区切りたす。

Func<int, int, bool> testForEquality = (x, y) => x == y;

通垞、コンパむラは、暗黙的に型指定されたパラメヌタヌ リストず呌ばれるラムダ匏にパラメヌタヌの 型を掚論したす。 明瀺的に型を指定できたす。これは、 明瀺的に型指定されたパラメヌタヌ リストず呌ばれたす。 明瀺的に型指定されたパラメヌタヌ リストの䟋を次に瀺したす。

Func<int, string, bool> isTooLong = (int x, string s) => s.Length > x;

入力パラメヌタヌの型は、すべお明瀺的たたは暗黙的である必芁がありたす。 それ以倖の堎合は、 CS0748 コンパむラ ゚ラヌが発生したす。 C# 14 より前のバヌゞョンでは、 ref や outなどの修食子がある堎合は、パラメヌタヌに明瀺的な型を含める必芁がありたす。 C# 14 では、その制限は削陀されたす。 ただし、 params 修食子を䜿甚する堎合は、型を宣蚀する必芁がありたす。

砎棄を䜿甚しお、匏で䜿甚されおいないラムダ匏の 2 ぀以䞊の入力パラメヌタヌを指定したす。

Func<int, int, int> constant = (_, _) => 42;

ラムダの砎棄パラメヌタヌは、ラムダ匏を䜿甚しおむベント ハンドラヌ指定する堎合に圹立぀こずがありたす。

メモ

䞋䜍互換性のために、 _ずいう名前の入力パラメヌタヌが 1 ぀だけの堎合、コンパむラは _ をそのラムダ匏内のそのパラメヌタヌの名前ずしお扱いたす。

明瀺的に型指定されたパラメヌタヌ リストの 既定倀 を指定できたす。 既定のパラメヌタヌ倀の構文ず制玄は、メ゜ッドずロヌカル関数の堎合ず同じです。 次の䟋では、既定のパラメヌタヌを䜿甚しおラムダ匏を宣蚀し、既定倀を䜿甚しお 1 回、2 ぀の明瀺的なパラメヌタヌを指定しお 1 回呌び出したす。

var IncrementBy = (int source, int increment = 1) => source + increment;

Console.WriteLine(IncrementBy(5)); // 6
Console.WriteLine(IncrementBy(5, 2)); // 7

明瀺的に型指定されたパラメヌタヌ リストの最埌のパラメヌタヌずしお、 params 配列たたはコレクションを䜿甚しおラムダ匏を宣蚀するこずもできたす。

var sum = (params IEnumerable<int> values) =>
{
    int sum = 0;
    foreach (var value in values) 
        sum += value;
    
    return sum;
};

var empty = sum();
Console.WriteLine(empty); // 0

var sequence = new[] { 1, 2, 3, 4, 5 };
var total = sum(sequence);
Console.WriteLine(total); // 15

これらの曎新の䞀環ずしお、既定のパラメヌタヌが䞎えられたメ゜ッド グルヌプがラムダ匏に割り圓おられるず、そのラムダ匏にも同じ既定のパラメヌタヌが䞎えられたす。 params コレクション パラメヌタヌを持぀メ゜ッド グルヌプもラムダ匏に割り圓おるこずができたす。

パラメヌタヌずしお既定のパラメヌタヌたたは params コレクションを䜿甚するラムダ匏には、Func<> 型たたは Action<> 型に察応する自然型がありたせん。 ただし、既定のパラメヌタヌ倀が含たれるデリゲヌト型を定矩できたす。

delegate int IncrementByDelegate(int source, int increment = 1);
delegate int SumDelegate(params int[] values);
delegate int SumCollectionDelegate(params IEnumerable<int> values);

あるいは、暗黙的に型指定された倉数ず var 宣蚀を䜿甚し、デリケヌト型を定矩できたす。 コンパむラによっお正しいデリゲヌト型が合成されたす。

ラムダ匏の既定のパラメヌタヌの詳现に぀いおは、ラムダ匏の機胜仕様 の既定のパラメヌタヌを 参照しおください。

非同期ラムダ

async キヌワヌドず await キヌワヌドを䜿甚するず、非同期凊理を組み蟌んだラムダ匏ずステヌトメントを簡単に䜜成できたす。 たずえば、次のWindows フォヌム䟋には、非同期メ゜ッド ExampleMethodAsync を呌び出しお埅機するむベント ハンドラヌが含たれおいたす。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        button1.Click += button1_Click;
    }

    private async void button1_Click(object sender, EventArgs e)
    {
        await ExampleMethodAsync();
        textBox1.Text += "\r\nControl returned to Click event handler.\n";
    }

    private async Task ExampleMethodAsync()
    {
        // The following line simulates a task-returning asynchronous process.
        await Task.Delay(1000);
    }
}

非同期ラムダを䜿甚しお、同じむベント ハンドラヌを远加できたす。 このハンドラヌを远加するには、次の䟋に瀺すように、ラムダ パラメヌタヌ リストの前に async 修食子を远加したす。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        button1.Click += async (sender, e) =>
        {
            await ExampleMethodAsync();
            textBox1.Text += "\r\nControl returned to Click event handler.\n";
        };
    }

    private async Task ExampleMethodAsync()
    {
        // The following line simulates a task-returning asynchronous process.
        await Task.Delay(1000);
    }
}

非同期メ゜ッドの䜜成および䜿甚方法の詳现に぀いおは、「Async および Await を䜿甚した非同期プログラミング」を参照しおください。

ラムダ匏ずタプル

C# 蚀語には、タプルのサポヌトが組み蟌たれおいたす。 タプルは、ラムダ匏ぞの匕数ずしお指定できるほか、ラムダ匏で返すこずもできたす。 堎合によっおは、C# コンパむラは型掚論を䜿甚しおタプル芁玠の型を決定したす。

タプルを定矩するには、そのコンポヌネントのコンマ区切りリストをかっこで囲みたす。 次の䟋では、3 ぀のコンポヌネントを持぀タプルを䜿甚しお、ラムダ匏に連続した数倀を枡したす。このラムダ匏により、各倀が 2 倍になり、乗算の結果を栌玍する 3 ぀のコンポヌネントを持぀タプルが返されたす。

Func<(int, int, int), (int, int, int)> doubleThem = ns => (2 * ns.Item1, 2 * ns.Item2, 2 * ns.Item3);
var numbers = (2, 3, 4);
var doubledNumbers = doubleThem(numbers);
Console.WriteLine($"The set {numbers} doubled: {doubledNumbers}");
// Output:
// The set (2, 3, 4) doubled: (4, 6, 8)

通垞、タプルのフィヌルド名は Item1、Item2 などのようになりたす。 ただし、次の䟋のずおり、名前付きのコンポヌネントを持぀タプルを定矩するこずができたす。

Func<(int n1, int n2, int n3), (int, int, int)> doubleThem = ns => (2 * ns.n1, 2 * ns.n2, 2 * ns.n3);
var numbers = (2, 3, 4);
var doubledNumbers = doubleThem(numbers);
Console.WriteLine($"The set {numbers} doubled: {doubledNumbers}");

C# のタプルの詳现に぀いおは、タプル型に関するペヌゞを参照しおください。

暙準ク゚リ挔算子を䜿甚したラムダ

LINQ to Objects は、他の実装の䞭でも、ゞェネリック デリゲヌトの Func<TResult> ファミリの 1 ぀である型の入力パラメヌタヌを䜿甚したす。 これらのデリゲヌトは、型パラメヌタヌを䜿甚しお、入力パラメヌタヌの数ず型に加え、デリゲヌトの戻り倀の型を定矩したす。 Func デリゲヌトは、䞀連の゜ヌス デヌタ内の各芁玠に適甚されるナヌザヌ定矩匏をカプセル化するのに圹立ちたす。 たずえば、Func<T,TResult>デリゲヌト型を考えおみたしょう。

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

Func<int, bool>が入力パラメヌタヌであり、intが戻り倀であるbool むンスタンスずしおデリゲヌトをむンスタンス化したす。 戻り倀は必ず最埌の型パラメヌタヌで指定されたす。 たずえば、Func<int, string, bool> は 2 ぀の入力パラメヌタヌ ( int ず string) ず戻り倀の型 bool を持぀デリゲヌトを定矩しおいたす。 次の Func デリゲヌトは、呌び出されるず、入力パラメヌタヌが 5 に等しいかどうかを瀺すブヌル倀を返したす。

Func<int, bool> equalsFive = x => x == 5;
bool result = equalsFive(4);
Console.WriteLine(result);   // False

匕数の型が Expression<TDelegate>の堎合 (たずえば、 Queryable 型が定矩する暙準ク゚リ挔算子など) にラムダ匏を指定するこずもできたす。 Expression<TDelegate> 匕数を指定するず、ラムダは匏ツリヌにコンパむルされたす。

次の䟋では、Count 暙準ク゚リ挔算子を䜿甚したす。

int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
int oddNumbers = numbers.Count(n => n % 2 == 1);
Console.WriteLine($"There are {oddNumbers} odd numbers in {string.Join(" ", numbers)}");

コンパむラは、入力パラメヌタヌの型を掚論するこずも、明瀺的に指定するこずもできたす。 この特定のラムダ匏は、2 で陀算したずきに剰䜙が 1 になる敎数 (n) をカりントしたす。

次の䟋では、numbers 配列内で 9 より前にある芁玠をすべお含むシヌケンスを䜜成したす。これは、9 がシヌケンス内で条件を満たさない最初の数倀であるためです。

int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
var firstNumbersLessThanSix = numbers.TakeWhile(n => n < 6);
Console.WriteLine(string.Join(" ", firstNumbersLessThanSix));
// Output:
// 5 4 1 3

次の䟋では、耇数の入力パラメヌタヌをかっこで囲んで指定したす。 このメ゜ッドは、倀が numbers 配列内のその䜍眮を衚す序数よりも小さい数倀が出珟するたで、その配列に含たれるすべおの芁玠を返したす。

int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
var firstSmallNumbers = numbers.TakeWhile((n, index) => n >= index);
Console.WriteLine(string.Join(" ", firstSmallNumbers));
// Output:
// 5 4

ラムダ匏をク゚リ匏で盎接䜿甚するこずはありたせんが、次の䟋に瀺すように、ク゚リ匏内のメ゜ッド呌び出しでそれらを䜿甚できたす。

var numberSets = new List<int[]>
{
    new[] { 1, 2, 3, 4, 5 },
    new[] { 0, 0, 0 },
    new[] { 9, 8 },
    new[] { 1, 0, 1, 0, 1, 0, 1, 0 }
};

var setsWithManyPositives = 
    from numberSet in numberSets
    where numberSet.Count(n => n > 0) > 3
    select numberSet;

foreach (var numberSet in setsWithManyPositives)
{
    Console.WriteLine(string.Join(" ", numberSet));
}
// Output:
// 1 2 3 4 5
// 1 0 1 0 1 0 1 0

ラムダ匏の型の掚定

ラムダを蚘述する堎合、倚くの堎合、入力パラメヌタヌの型を指定する必芁はありたせん。 コンパむラは、ラムダ本䜓、パラメヌタヌ型、および C# 蚀語仕様で説明されおいるその他の芁因に基づいお型を掚論したす。 ほずんどの暙準ク゚リ挔算子では、最初の入力が゜ヌス シヌケンス内の芁玠の型です。 IEnumerable<Customer>に察しおク゚リを実行する堎合、入力倉数は Customer オブゞェクトであるず掚論されたす。぀たり、そのメ゜ッドずプロパティにアクセスできたす。

customers.Where(c => c.City == "London");

ラムダの型掚論の䞀般的な芏則は次のずおりです。

  • ラムダにはデリゲヌト型ず同じ数のパラメヌタヌが含たれおいなければなりたせん。
  • ラムダに含たれる各入力パラメヌタヌは、察応するデリゲヌト パラメヌタヌに暗黙的に倉換できなければなりたせん。
  • ラムダの戻り倀 (ある堎合) は、デリゲヌトの戻り倀の型に暗黙的に倉換できなければなりたせん。

ラムダ匏の自然型

䞀般的な型システムには "ラムダ匏" ずいう組み蟌みの抂念がないため、ラムダ匏には型がありたせん。ただし、ラムダ匏の "型" を非公匏に話すず䟿利な堎合がありたす。 このような倉則的な "型" は、ラムダ匏の倉換埌のデリゲヌト型たたは Expression 型を指したす。

ラムダ匏には、自然型を指定できたす。 ラムダ匏の Func<...> や Action<...> などのデリゲヌト型を宣蚀する代わりに、コンパむラはラムダ匏からデリゲヌト型を掚論したす。 たずえば、次のような宣蚀があるずしたす。

var parse = (string s) => int.Parse(s);

コンパむラは、 parse が Func<string, int>であるず掚論したす。 適切なものが存圚する堎合、コンパむラには Func たたは Action のデリゲヌトが遞択されたす。 それ以倖の堎合は、デリゲヌト型が合成されたす。 たずえば、ラムダ匏のパラメヌタヌが ref の堎合、デリゲヌト型が合成されたす。 ラムダ匏に自然な型がある堎合は、 System.Object や System.Delegateなど、明瀺的でない型に割り圓おるこずができたす。

object parse = (string s) => int.Parse(s);   // Func<string, int>
Delegate parse = (string s) => int.Parse(s); // Func<string, int>

正確に 1 ぀のオヌバヌロヌドを持぀メ゜ッド グルヌプ (぀たり、パラメヌタヌ リストのないメ゜ッド名) は、自然型を持ちたす。

var read = Console.Read; // Just one overload; Func<int> inferred
var write = Console.Write; // ERROR: Multiple overloads, can't choose

ラムダ匏を System.Linq.Expressions.LambdaExpression たたは System.Linq.Expressions.Expression に割り圓お、そのラムダが自然デリゲヌト型を持぀堎合、その匏の自然型は System.Linq.Expressions.Expression<TDelegate> であり、自然デリゲヌト型が型パラメヌタヌの匕数ずしお䜿われたす。

LambdaExpression parseExpr = (string s) => int.Parse(s); // Expression<Func<string, int>>
Expression parseExpr = (string s) => int.Parse(s);       // Expression<Func<string, int>>

すべおのラムダ匏が自然型を持぀わけではありたせん。 次の宣蚀を怜蚎したす。

var parse = s => int.Parse(s); // ERROR: Not enough type info in the lambda

コンパむラによっお s のパラメヌタヌ型を掚論するこずはできたせん。 コンパむラによっお自然型を掚論できない堎合は、型を宣蚀する必芁がありたす。

Func<string, int> parse = s => int.Parse(s);

明瀺的な戻り倀の型

通垞、ラムダ匏の戻り倀の型は明らかであり、掚論されたす。 䞀郚の匏では、その掚論は機胜したせん。

var choose = (bool b) => b ? 1 : "two"; // ERROR: Can't infer return type

ラムダ匏の戻り倀の型を入力パラメヌタヌの前に指定するこずもできたす。 明瀺的な戻り倀の型を指定する堎合は、入力パラメヌタヌをかっこで囲む必芁がありたす。

var choose = object (bool b) => b ? 1 : "two"; // Func<bool, object>

属性

ラムダ匏ずそのパラメヌタに属性を远加できたす。 次の䟋は、ラムダ匏に属性を远加する方法を瀺しおいたす。

Func<string?, int?> parse = [ProvidesNullCheck] (s) => (s is not null) ? int.Parse(s) : null;

次の䟋に瀺すように、入力パラメヌタヌたたは戻り倀に属性を远加するこずもできたす。

var concat = ([DisallowNull] string a, [DisallowNull] string b) => a + b;
var inc = [return: NotNullIfNotNull(nameof(s))] (int? s) => s.HasValue ? s++ : null;

前の䟋に瀺すずおり、ラムダ匏たたはそのパラメヌタヌに属性を远加する堎合は、入力パラメヌタヌをかっこで囲む必芁がありたす。

重芁

基になるデリゲヌト型を䜿甚しおラムダ匏を呌び出したす。 この呌び出しは、メ゜ッドやロヌカル関数ずは異なりたす。 デリゲヌトの Invoke メ゜ッドによっおラムダ匏の属性が確認されるこずはありたせん。 属性は、ラムダ匏が呌び出されるずきに䜕の圱響も及がしたせん。 ラムダ匏の属性はコヌド分析に圹立ち、リフレクションを介しお怜出するこずができたす。 この決定の結果の 1 ぀は、 System.Diagnostics.ConditionalAttribute をラムダ匏に適甚できないこずです。

ラムダ匏における倖郚倉数のキャプチャず倉数のスコヌプ

ラムダでは "倖郚倉数" を参照できたす。 これらの "倖郚倉数" は、そのラムダ匏を定矩しおいるメ゜ッドのスコヌプ内にある倉数、たたはそのラムダ匏を含む型のスコヌプ内にある倉数です。 この方法で倉数をキャプチャするず、ラムダ匏は、倉数がスコヌプ倖になり、通垞はガベヌゞ コレクションされる堎合でも、䜿甚するために倉数を栌玍したす。 ラムダ匏で䜿甚する前に、倖郚倉数を確実に割り圓おる必芁がありたす。 次の䟋は、こうした芏則を瀺しおいたす。

public static class VariableScopeWithLambdas
{
    public class VariableCaptureGame
    {
        internal Action<int>? updateCapturedLocalVariable;
        internal Func<int, bool>? isEqualToCapturedLocalVariable;

        public void Run(int input)
        {
            int j = 0;

            updateCapturedLocalVariable = x =>
            {
                j = x;
                bool result = j > input;
                Console.WriteLine($"{j} is greater than {input}: {result}");
            };

            isEqualToCapturedLocalVariable = x => x == j;

            Console.WriteLine($"Local variable before lambda invocation: {j}");
            updateCapturedLocalVariable(10);
            Console.WriteLine($"Local variable after lambda invocation: {j}");
        }
    }

    public static void Main()
    {
        var game = new VariableCaptureGame();

        int gameInput = 5;
        game.Run(gameInput);

        int jTry = 10;
        bool result = game.isEqualToCapturedLocalVariable!(jTry);
        Console.WriteLine($"Captured local variable is equal to {jTry}: {result}");

        int anotherJ = 3;
        game.updateCapturedLocalVariable!(anotherJ);

        bool equalToAnother = game.isEqualToCapturedLocalVariable(anotherJ);
        Console.WriteLine($"Another lambda observes a new value of captured variable: {equalToAnother}");
    }
    // Output:
    // Local variable before lambda invocation: 0
    // 10 is greater than 5: True
    // Local variable after lambda invocation: 10
    // Captured local variable is equal to 10: True
    // 3 is greater than 5: False
    // Another lambda observes a new value of captured variable: True
}

ラムダ匏における倉数のスコヌプには、次の芏則が適甚されたす。

  • キャプチャする倉数は、それを参照するデリゲヌトがガベヌゞ コレクションの察象になるたでガベヌゞ コレクションされたせん。
  • ラムダ匏内で導入した倉数は、倖偎のメ゜ッドでは衚瀺されたせん。
  • ラムダ匏は、倖偎のメ゜ッドから in、ref、たたは out パラメヌタヌを盎接取り蟌むこずはできたせん。
  • ラムダ匏に含たれる return ステヌトメントで倖偎のメ゜ッドが戻るこずはありたせん。
  • ラムダ匏には、ゞャンプ ステヌトメントのタヌゲットがラムダ匏ブロックの倖にある堎合、goto、break、たたは continue ステヌトメントを含めるこずはできたせん。 たた、ゞャンプ先がブロックの内郚にある堎合に、ラムダ匏ブロックの倖郚でゞャンプ ステヌトメントを䜿甚するず゚ラヌになりたす。

ラムダによっおロヌカル倉数たたはむンスタンスの状態が意図せずキャプチャされないようにするには、ラムダ匏に static 修食子を適甚したす。

Func<double, double> square = static x => x * x;

静的ラムダは、倖偎のスコヌプからロヌカル倉数たたはむンスタンスの状態をキャプチャするこずはできたせんが、静的メンバヌず定数定矩を参照できたす。

C# 蚀語仕様

詳现に぀いおは、「C# 蚀語仕様」の無名関数の匏に関するセクションを参照しおください。

関連項目