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

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

川俣 晶
2010/02/01

12.5 varが使用できない場面

 以下に、varが使用できない場面をいくつか紹介しよう。

■型を知るためのヒントが何もない

 varは「暗黙的に型指定されるローカル変数」を示すのであって、「代入されるまで型が確定しないローカル変数」ではない。つまり、宣言時に型が決まらないと宣言できないのである。

 それゆえに、次のような変数宣言は認められない。型を確定するためのヒントが何もないからである。

var a;
// エラー  1  暗黙的に型指定されたローカル変数を初期化しなければなりません

 一方、次のように書けばヒントは得られるので許される。

var a = 型が明確に決まる式;

 「型が明確に決まる式」とは、たとえば「123」のような整数でもよい。「123はint型である」ということが曖昧さがなく決まるからである。

■ローカル変数以外

 まず、「暗黙的に型指定される『ローカル変数』」という名前からわかるとおり、対象となるのはローカル変数だけである。つまり、フィールドには使用できない。次のリスト12.6のような使い方はNGである。明示的に型名を書かなければならない。

class Sample
{
  private int a = 1;
  private var b = 1;

   //エラー  1  コンテキスト キーワード 'var' は、ローカル変数宣言内でのみ有効です。
}
リスト12.6 フィールドにvarは使用できない

■ラムダ式、匿名メソッド

 varは、ラムダ式や匿名メソッドには使用できない

var calc = () => 1 + 2;
// エラー  1  ラムダ式 を暗黙的に型指定されたローカル変数に割り当てることはできません

var calc = delegate() { return 1 + 2; };

// エラー  1  匿名メソッド を暗黙的に型指定されたローカル変数に割り当てることはできません

 ただし、型が厳密に明示されたデリゲート型であれば問題なくvarで使用できる。そのため、上記の2例も、下記のようにデリゲート型へのキャストを挟めばそれだけでコンパイルが通るようになる。

var calcByラムダ式 = (Func<int>)(() => 1 + 2);

var calcBy匿名メソッド = (Func<int>)delegate() { return 1 + 2; };

 しかし、この知識はあまり役立たないだろう。なぜかといえば、次のようにvarを使わない宣言を行うほうが、よりカッコの数が少なく短く書けるからだ。

Func<int> calcByラムダ式 = () => 1 + 2;

Func<int> calcBy匿名メソッド = delegate() { return 1 + 2; };

■null値の初期化

 null値で初期化する場合、varは使用できない

var a = null;
// エラー  1  <null> を暗黙的に型指定されたローカル変数に割り当てることはできません

 しかし、null値であろうと、厳密な型を持っていればvarを使用できる。次のようにnullをキャストすると問題なくvarで変数を宣言できる。

var a = (string)null;


 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 記事ランキング

本日 月間