この章のテーマ §
キャストとas演算子を学びます。これらは、型を変換する機能ですが、機能は同じではありません。
前提知識 §
Console.WriteLineメソッド, 文字列の基礎, 変数の基礎, 条件演算子, int型, string型, string?型, if文, 継承, Null許容型
解説 §
C#の全ての型には継承関係があります。そのため、継承関係のある他の型として扱うことも可能です。また、変換可能な型もあります。整数の1を実数の1に変換することは可能です。
暗黙の変換が実行できる場合は、特に何も指定せずに変換できます。
明示的に変換場合は、C#には機能が2つあります。キャストとas演算子です。
キャストはカッコで囲った型名で記述します。たとえば、(float)1の場合、1の型は整数になりますが、(float)1の型はfloat型(実数)になります。
as演算子は、値 as 型名と書いて型名を変換します。たとえば、x as stringと書くとxの型がobjectでも、x as stringの型はstring型になります。
一般的にキャストは高機能で低速ですが、as演算子は機能限定で低速とされます。また、キャストは変換できない時に例外を発生させますが、as演算子は結果がnullになり、振る舞いが異なります。
罠の数々 §
- サンプルソースのbyte c = (byte)(a + b);は、キャストなしには書けない。なぜなら加算の結果は最低int型になるが、int型は32bit幅なので8bit幅のbyte型には格納できないからだ
- as演算子はnullを許容している型にしか使用できない。変換できなかった時にnull値になるという機能からの必然だ。だから値型の変換にはキャストを使うしかない
- 例外は比較的重い処理なので、例外を発生させる可能性のあるキャストはできれば避けた方が良い。as演算子で書けるときはas演算子で書こう
参考リンク §
型のテスト演算子とキャスト式 (C# リファレンス)
as 演算子
キャスト式
サンプルソース: kw_as_cast §
Console.WriteLine("キャストの利用例");
byte a=1;
byte b=2;
byte c = (byte)(a + b);
Console.WriteLine($"a+b={c}");
Console.WriteLine("as演算子の利用例");
object s = "hello!";
string? t = s as string;
if (t != null) Console.WriteLine($"upper letter of s={t.ToUpper()}");
実行結果 §
キャストの利用例
a+b=3
as演算子の利用例
upper letter of s=HELLO!
リポジトリ §
https://github.com/autumn009/CSharpPrimer2
練習問題 §
以下のプログラムの実行結果を予測してみよう。
object a = 1;
string? b = a as string;
Console.WriteLine(b == null);
- 1
- False
- True
- 例外発生 (整数の1をstring型には変換できない)
- コンパイルエラー (1は整数だからas演算子は使えない)
[[解答]]