|
|
連載:[完全版]究極のC#プログラミング
Chapter12 varによる変数宣言とコレクション初期化子
川俣 晶
2010/02/01 |
|
|
12.5 varが使用できない場面
以下に、varが使用できない場面をいくつか紹介しよう。
■型を知るためのヒントが何もない
varは「暗黙的に型指定されるローカル変数」を示すのであって、「代入されるまで型が確定しないローカル変数」ではない。つまり、宣言時に型が決まらないと宣言できないのである。
それゆえに、次のような変数宣言は認められない。型を確定するためのヒントが何もないからである。
var a;
// エラー 1 暗黙的に型指定されたローカル変数を初期化しなければなりません
|
|
一方、次のように書けばヒントは得られるので許される。
「型が明確に決まる式」とは、たとえば「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で変数を宣言できる。
Insider.NET 記事ランキング
本日
月間