C# ラムダ式の型推論
ラムダ式では、コンパイラがコンテキストから引数の型を推論してくれます。これにより、型を明示的に書かなくても簡潔にコードを記述できます。
型推論の基本
デリゲート型や Func / Action に代入する際、コンパイラは期待される型からラムダ式のパラメータ型を推論します。
// 型を省略(推論に任せる)
Func<int, int, int> add = (a, b) => a + b;
// 型を明示的に書く(同じ意味)
Func<int, int, int> addExplicit = (int a, int b) => a + b;どちらも同じ動作をしますが、推論に任せたほうがコードが簡潔になります。
LINQ での型推論
LINQ メソッドでは、コレクションの要素型から自動的にラムダ式のパラメータ型が決まります。
var numbers = new List<int> { 1, 2, 3, 4, 5 };
// x は int 型と推論される
var doubled = numbers.Select(x => x * 2);
// item は int 型と推論される
var evens = numbers.Where(item => item % 2 == 0);numbers が List<int> なので、Select や Where に渡すラムダ式のパラメータは int 型と推論されます。
型を明示すべき場面
通常は型推論に任せて問題ありませんが、以下のような場合は型を明示する必要があります。
オーバーロードの解決
同名で引数の型だけが異なるメソッドを呼び出す場合、コンパイラが曖昧さを解決できないことがあります。
var との組み合わせ
ラムダ式単体では型が決まらないため、var lambda = x => x * 2; のような書き方はできません。
// これはコンパイルエラー
// var lambda = x => x * 2;
// 型を指定すれば OK
Func<int, int> lambda = x => x * 2;
// または明示的な型指定
var lambda2 = (int x) => x * 2;C# 10 以降の自然型
C# 10 からは、パラメータに型を明示すれば var でもラムダ式を受け取れるようになりました。
// C# 10 以降
var square = (int x) => x * x;
var greet = (string name) => $"Hello, {name}!";コンパイラが適切な Func 型を推論してくれます。型推論を活用しつつも、必要に応じて明示的に型を書くことで、意図を明確に伝えられます。