連載:[完全版]究極のC#プログラミング

Chapter12 varによる変数宣言とコレクション初期化子

川俣 晶
2010/02/01

12.3 暗黙的に型を明示する

 Variant型の悪夢の例を、varキーワードを使ってできるだけ忠実にC# 3.0に書き換えてみよう。すると、すぐに重大な問題に直面することになる。

 VB 6.0の「Dim a, b」に相当する次の変数宣言がエラーになってコンパイルできないのである。

var a, b;
// エラー  1  暗黙的に型指定されたローカル変数を初期化しなければなりません
// エラー  2  暗黙的に型指定されたローカル変数には複数の宣言子を指定できません

 つまり、1つの宣言では1つの変数しか宣言できず、かつ、初期化されなければならないわけである。

 この構文上の制約を受け入れたうえで、C#に書き直してみよう(リスト12.2参照)。しかし、このコードはコンパイルできない。発生するエラーはコメントとして記した。

using System;

class Program
{
  static void Main(string[] args)
  {
    var a = 1;
    var b = "2";
    Console.WriteLine(a + b);

    a = "1";
   // エラー  1  型 'string' を型 'int' に暗黙的に変換できません。

    b = 2;
   // エラー  2  型 'int' を型 'string' に暗黙的に変換できません。

    Console.WriteLine(a + b);

    a = "1";
   // エラー  3  型 'string' を型 'int' に暗黙的に変換できません。

    b = "2";

    Console.WriteLine(a + b);
  }
}
リスト12.2 コンパイルできない「Variant型の悪夢 C#版」

 見てのとおり、Variant型の変数aには整数を入れた後で文字列を入れることが可能だったのに対して、「暗黙的に型指定されるローカル変数」の変数aは、整数で初期化した後で文字列を代入することはできない。そのような代入を行うソースコードは、実行時ではなくコンパイル時にエラーとなってはじかれてしまうのである。

 つまり、「暗黙的に型指定されるローカル変数」がVariant型と似ているように見えるとしても、それは単なる錯覚にすぎず、両者はまったく異なる機能性を持っているのである。したがって、上記のような「Variant型の悪夢」はC# 3.0においては発生しない

 まとめると次のようになる。

  • 「暗黙的に型指定されるローカル変数」は、変数の宣言に伴い、初期化のための式によって型が決定され、その型は厳格に貫徹される(「var a = 1;」と「int a = 1;」は完全に等価)
  • 型はコンパイル時に確定し、コンパイル時にチェックされる。LL信奉者に期待する者が多い“実行時まで型の解釈を遅延する”機能とはまったく違う。逆に、できるだけコンパイル時に型チェックをさせたい者たちが期待する機能とイコールである

 INDEX
  [完全版]究極のC#プログラミング
  Chapter12 varによる変数宣言とコレクション初期化子
    1.12.1 暗黙的に型指定されるローカル変数
    2.12.2 Variant型の悪夢
  3.12.3 暗黙的に型を明示する
    4.12.4 なぜvarを使うのか?
    5.12.5 varが使用できない場面
    6.12.6 varを活用できる場面
    7.12.7 暗黙的に型指定されるローカル配列
    8.12.8 暗黙に型付けされた配列と型の推測
    9.12.9 暗黙に型付けされた配列とnull
    10.12.10 コレクション初期化子
    11.12.11 Dictionaryクラスとコレクション初期化子
    12.12.12 引数が2つのAddメソッドとコレクション初期化子/C#olumn
 
インデックス・ページヘ  「[完全版]究極の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 記事ランキング

本日 月間