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

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

川俣 晶
2010/02/01

12.8 暗黙に型付けされた配列と型の推測

 通常の変数と違って、配列の初期化リストは複数の型の値を列挙できるため、解釈が難しい

 まず、継承された3つのクラスのインスタンスを使用した事例から、どのように型が推測されるかを見てみよう(リスト12.11参照)。

using System;

class A
{
}

class B : A
{
}

class C : A
{
}

class Program
{
  static void Main(string[] args)
  {
    var case1 = new[] { new A(), new A(), new A() };
    var case2 = new[] { new B(), new B(), new B() };
    var case3 = new[] { new C(), new C(), new C() };
    var case4 = new[] { new A(), new B(), new C() };

    Console.WriteLine(case1.GetType().Name); // 出力:A[]
    Console.WriteLine(case2.GetType().Name); // 出力:B[]
    Console.WriteLine(case3.GetType().Name); // 出力:C[]
    Console.WriteLine(case4.GetType().Name); // 出力:A[]
  }
}
リスト12.11 推測された配列の型を確認する

 つまり、変数case1〜case3が示すように、型が統一されていればその型が採用される。しかし、変数case4のように、配列内に複数の型が混在する場合、すべての値が変換可能な型としてAが選択され、A[]という型になっている。

 しかし、推測は万能ではない。次のコードはコンパイルエラーになる。

var case5 = new[] { new B(), new B(), new C() };
// エラー  1  暗黙的に型指定された配列の最適な型が見つかりませんでした

 このケースでは、変数の型をA[]とすれば記述可能である。しかし、この初期化リストに含まれる型の候補はBとCであり、Aは含まれない。それゆえ、A[]という推測はできず、コンパイルはエラーになる。

 逆にいえば、この配列は次のように型を明示すればコンパイルできる。

A[] case5 = { new B(), new B(), new C() }; // OK

 なお、数値に関してもこのような推測が行われる。たとえば、整数(int)と実数(double)が混在した初期化リストがあるとき、これはdouble[]と推測される。int型は暗黙的にdouble型に変換可能だからである。

var a = new[] { 1, 1.1, 1.2 }; // aはdouble[]型と推測される


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

本日 月間