型推論

型推論と 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つのコードは完全に同一となります。

注意点

  1. var動的型ではありません。構文上の省略記法に過ぎず、コンパイル時に推論された型が確定し、後から変更できなくなります。二つのコードの意味は完全に同等です。
  2. var を使う際の制約事項:
    • ローカル変数にのみ利用可能。クラスのフィールドには使用できない
    • 変数宣言時に初期値を代入する必要があるvar x; とだけ書くことは許可されない
    • 推論後の型は固定され、その変数に別の型のデータを代入することはできない
  3. 重要な相違点: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)

型推論

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です