型推論と var キーワード
下記のコードを見てみましょう。変数宣言の先頭に記述する型は、コンパイラがイコール記号の右辺にある初期化値から自動的に導き出せます。たとえば「18」は整数の int と判断でき、Phone() は Phone 型と推測できるでしょうか。
static void Main( )
{
int age = 18; // 右辺の18からint型と自動推論
Phone p = new Phone(); // 右辺のコンストラクタはPhoneオブジェクトを返す
}
Code language: C# (cs)
では上記のコードは、さらに簡略化できるのでしょうか。
C# には var キーワードが用意されており、明示的な型指定の代わりに使って記述を簡潔にできます。
static void Main( )
{
var age = 18;
var p = new Phone();
}
Code language: JavaScript (javascript)
こちらのコードでは左辺の変数にすべて var を使用しています。コンパイラは右辺の情報から適切な型を推論し、コンパイル後の2つのコードは完全に同一となります。

注意点
varは動的型ではありません。構文上の省略記法に過ぎず、コンパイル時に推論された型が確定し、後から変更できなくなります。二つのコードの意味は完全に同等です。varを使う際の制約事項:- ローカル変数にのみ利用可能。クラスのフィールドには使用できない
- 変数宣言時に初期値を代入する必要がある。
var x;とだけ書くことは許可されない - 推論後の型は固定され、その変数に別の型のデータを代入することはできない
- 重要な相違点:C# の
var≠ JavaScript のvar。JavaScript の var は動的弱型で、変数に任意の型の値を随時代入可能です。C# の var は静的強型言語の簡略記法であり、C# が強型言語である性質は変わりません。
つまり上記の var はコンパイル処理の段階で、右辺の値をもとに age の型を int、p の型を Phone に置き換えます。最終的に最初に示したコードと同じ状態になります。
その後、変数の型を変更することは認められません。例を見てみましょう。

class Program
{
static void Main()
{
var age = 18;
age = 3.14;
var p = new Phone();
}
}
class Phone
{
public string Name { get; set; }
}Code language: C# (cs)
この記述は C# ではエラーとなりますが、JavaScript や PHP といった他の言語では許可されます。これらの言語では変数の型を自由に切り替えられる仕組みです。
JavaScript と PHP は 弱型・動的型言語に分類され、変数に固定の型制限が存在しません。

不正なコード例
class Program
{
static void Main()
{
var age = 18;
age = 3.14;
var p = new Phone();
var isBuy;
}
}
class Phone
{
var price = 1000;
var model = "iPhone";
int count = 12;
}Code language: C# (cs)
型推論
Previous: メソッド(Method)
Next: 入れ子コードブロックとスコープ