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

Chapter5 null許容型

川俣 晶
2009/09/28

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#の表記に必ずしも従わない。


 INDEX
  [完全版]究極のC#プログラミング
  Chapter5 null許容型
    1.5.1 null許容型とは何か?
    2.5.2 なぜnullを入れたいのか?
    3.5.3 null許容型の内部構造
    4.5.4 null合体演算子
  5.5.5 is演算子の挙動に注意
    6.5.6 3値論理型として使用できるbool?型
    7.5.7 nullを許容するとパフォーマンスに影響するか?/null許容への批判/練習問題
 
インデックス・ページヘ  「[完全版]究極のC#プログラミング」

@IT Special

- PR -

TechTargetジャパン

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メールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

イベントカレンダー

PickUpイベント

- PR -

アクセスランキング

もっと見る

ホワイトペーパーTechTargetジャパン

注目のテーマ

Insider.NET 記事ランキング

本日 月間
ソリューションFLASH