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

numbersList<int> なので、SelectWhere に渡すラムダ式のパラメータは int 型と推論されます。

型を明示すべき場面

通常は型推論に任せて問題ありませんが、以下のような場合は型を明示する必要があります。

オーバーロードの解決

同名で引数の型だけが異なるメソッドを呼び出す場合、コンパイラが曖昧さを解決できないことがあります。

var との組み合わせ

ラムダ式単体では型が決まらないため、var lambda = x =&gt; x * 2; のような書き方はできません。

// これはコンパイルエラー
// var lambda = x =&gt; x * 2;

// 型を指定すれば OK
Func&lt;int, int&gt; lambda = x =&gt; x * 2;

// または明示的な型指定
var lambda2 = (int x) =&gt; x * 2;

C# 10 以降の自然型

C# 10 からは、パラメータに型を明示すれば var でもラムダ式を受け取れるようになりました。

// C# 10 以降
var square = (int x) =&gt; x * x;
var greet = (string name) =&gt; $"Hello, {name}!";

コンパイラが適切な Func 型を推論してくれます。型推論を活用しつつも、必要に応じて明示的に型を書くことで、意図を明確に伝えられます。