|
|
連載:[完全版]究極の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[]型と推測される
|
|
Insider.NET 記事ランキング
本日
月間