|
|
連載:[完全版]究極の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信奉者に期待する者が多い“実行時まで型の解釈を遅延する”機能とはまったく違う。逆に、できるだけコンパイル時に型チェックをさせたい者たちが期待する機能とイコールである
Insider.NET 記事ランキング
本日
月間