|
|
連載:[完全版]究極のC#プログラミング
Chapter5 null許容型
川俣 晶
2009/09/28 |
![](/fdotnet/extremecs/index/extremecs_m.jpg) |
|
5.5 is演算子の挙動に注意
is演算子も、null許容型に対してストレートではない挙動を示す(リスト5.8参照)。
using System;
class Program
{
static void Main(string[] args)
{
int? a;
a = 123;
Console.WriteLine(a is string); // 出力:False
Console.WriteLine(a is int); // 出力:True
Console.WriteLine(a is int?); // 出力:True
a = null;
Console.WriteLine(a is string); // 出力:False
Console.WriteLine(a is int); // 出力:False
Console.WriteLine(a is int?); // 出力:False
Console.WriteLine(123 is string); // 出力:False
Console.WriteLine(123 is int); // 出力:True
Console.WriteLine(123 is int?); // 出力:True
}
}
|
|
リスト5.8 is演算子を適用した例 |
これを見るとわかるとおり、null許容型として宣言された変数aに整数を入れた場合、「a is int」と「a is int?」の双方がtrue*7になる。それどころか、純粋な整数(int型)の定数123に対してすら、「123 is int」と「123 is int?」の双方がtrueになる。
一方、nullを入れた場合、「a is int」と「a is int?」の双方がfalseになる。ちなみに、nullが入っているとfalseになるのはis演算子の基本的な仕様で、ほかの参照型を相手にしても同じようにfalseになる(「a is string」がfalseになっているのはそのため)。
ここで、is演算子は、「int?」という型に対して一般の型とは違った挙動を示すことを確認しておくことは価値がある。
明らかにint型であってint?型ではない定数123に対して、「123 is int?」がtrueになるというのは、変換の整合性を維持するためだろう。定数123はそのままint?型の変数に代入できるわけで、それは暗黙的にint?型に変換可能ということを意味する。したがって、「123 is int?」はtrueであるほうが使いやすいのだろう。
ちなみに、値型には使用できないas演算子もnull許容型で使用できるよう拡張されている。
*7 C#のソースコード上での表記はすべて小文字のtrueとfalseだが、値を文字列に変換して出力させると先頭が大文字のTrueとFalseになる。これは、.NET Framework本体とC#の表記の差である。変換は.NET Frameworkのクラスライブラリが行うので、C#の表記に必ずしも従わない。 |
Insider.NET 記事ランキング
本日
月間