|
|
連載:[完全版]究極のC#プログラミング
Chapter7 ラムダ式(後編)
川俣 晶
2009/11/02 |
|
|
7.5 型指定を省略できる場合、できない場合
ほとんどの場合、ラムダ式の引数の型は省略できる。逆にいえば、型の推定ができない状況ではラムダ式が使用できない制限が課せられているともいえる。
たとえば、次のようなvarキーワードを用いて宣言する「暗黙的に型指定されるローカル変数」にラムダ式を代入することはできない。
var lambda = (int x) => x * 2;
|
|
このコードは、「ラムダ式を暗黙的に型指定されたローカル変数に割り当てることはできません」というエラーを発生させてしまう。回避するにはvarではなく、正しく型の名前を書く必要がある。
しかし、まれにラムダ式が使用できるにもかかわらず、型指定を行わなければならない状況が発生する。リスト7.15はその一例である。
using System;
delegate int delegate1( int x );
delegate int delegate2( string s );
class Program
{
private static void sample(delegate1 method)
{
Console.WriteLine("void Sample(delegate1 method)");
}
private static void sample(delegate2 method)
{
Console.WriteLine("void Sample(delegate2 method)");
}
static void Main(string[] args)
{
sample((int x) => 0);
// sample((x) => 0); // 引数の型指定をはずすとエラーになる
}
}
|
|
リスト7.15 引数の型指定が必須のケース |
このリストで、「sample((x) => 0)」はコンパイルエラーになる。条件を満たすsampleメソッドが2つあり、どちらを使うべきか判定するだけの情報が与えられていないからである。しかし、引数に型を添えて「sample((int x) => 0)」と記述すればコンパイルでき、実行もできる。引数に型が指定されたことで、2つのsampleメソッドのうち、型が一致するほうのデリゲートを明確に選択できるからである。
Insider.NET 記事ランキング
本日
月間