型名の後ろに"?" がある - null を許容する型の宣言 Nullable型の利用 - C#

概要

C#で型名の後ろに"?"記号がついているコードの紹介です。

型名の後ろの"?"はなに?

型名の後ろに"?" がついている場合、null を許容する型であるNullable型になります。

Nullable型とは

C# 2.0以降ではnullを許容できる、Nullable型を利用できます。Nullable型を利用することで、Nullの値をとることができない値型の変数(int, char, byte, DateTimeなど)にNULLの値をとらせることができます。

書式

(型名)? (変数名)
または
Nullable<(型名)> (変数名)
System.Nullable<(型名)> (変数名)
型名の直後に"?"を記述するとNullable 型となります。System.Nullable を利用する書式も可能です。

プログラム例

UI

下図のUIを作成します。

コード

下記のコードを記述します。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace NullableDemo
{
  public partial class FormStandardDemo : Form
  {
    public FormStandardDemo()
    {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
      int? nint = null;       //nullable型
      //System.Nullable<int> nint = null; //int? と同義
      int nnint = 0;

      nint = 3;
      nnint = 4;

      textBox1.Text = Convert.ToString(nint + nnint);

    }

    private void button2_Click(object sender, EventArgs e)
    {
      int? nint = null;       //nullable型
      int nnint = 0;

      nnint = 4;

      textBox1.Text = Convert.ToString(nint + nnint);

    }

    private void button3_Click(object sender, EventArgs e)
    {
      int? nint = null;       //nullable型
      System.Nullable<int> nint2 = null; //int? と同義
      int nnint = 0;

      //int X = nint;         //コンパイルエラー
      int X = (int)nint;    //ninit が nullの場合は実行時エラー
      nint2 = nint;           //OK
      nint = nnint;           //OK
    }
  }
}

解説

Nullable型の変数は"(型名)?"と宣言します。または"System.Nullable<型名>"と宣言します。Nullable型からNullableでない型へ変換する場合は明示的なキャストを用います。Nullableでない型からNullable型への変換は代入で暗示的に変換されます。

実行結果

プロジェクトを実行します。下図のウィンドウが表示されます。


[button1]をクリックします。計算結果の"7"が表示されます。


[button2]をクリックします。実行時エラーは発生せず、テキストボックスには何も表示されません。


[button3]をクリックします。実行時エラーが発生します。


補足: nullとの演算

下記コードで、nullに4を加算した値をresult に代入しています。nullに数値を加算した場合の結果はnullとなり、実行時エラーにはなりません。
実行可能なコード
      int? nint = null;       //nullable型
      int nnint = 0;
      int? result;

      nnint = 4;

      result = nint + nnint;
      textBox1.Text = Convert.ToString(result);

なお、nullに4を加算したものはnullとなるため、Nullableでない型に演算結果を代入することはできず、コンパイルエラーになります。
コンパイルエラーになる例
      int? nint = null;       //nullable型
      int nnint = 0;
      int result;

      nnint = 4;

      result = nint + nnint;
      textBox1.Text = Convert.ToString(result);
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
掲載日: 2009-10-07
改訂日: 2021-01-24
iPentec all rights reserverd.