連載:[完全版]究極の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メソッドのうち、型が一致するほうのデリゲートを明確に選択できるからである。


 INDEX
  [完全版]究極のC#プログラミング
  Chapter7 ラムダ式(後編)
    1.7.1 ラムダ式は何をもたらすか?
    2.7.2 ラムダ式と匿名メソッドの違い
    3.7.3 ステートメント型のラムダ
    4.7.4 式形式のラムダの可能性
  5.7.5 型指定を省略できる場合、できない場合
    6.7.6 何もしないラムダ式
    7.7.7 ラムダ式の使用例/【C#olumn】「=>」は不等号?
    8.7.8 ラムダ式のさまざまなバリエーション
    9.7.9 ジェネリックメソッドと型推論
    10.7.10 オーバーロードの解決/値型と参照型の相違は何か?/練習問題
 
インデックス・ページヘ  「[完全版]究極のC#プログラミング」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間