C# 入門

ホーム > C# の基礎 > Null 条件演算子

Null 条件演算子

ここでは C# 6.0 で導入された、Null 条件演算子 (Null-conditional operator) について説明します。

C# 6.0 よりも前のバージョンでは、ある変数が null かどうかをチェックするのは意外と面倒でした。例えば string も null になりますが、 null に対して String クラスのメソッドを呼び出しては Null 参照例外が発生してしまいますので、 String のメソッドを呼ぶ前には必ず null かどうかをチェックする必要があります。

次の例では Upper メソッドでは受け取った s の null をチェックしないで、ToUpper() を呼び出しています。

using System;

namespace Test1
{
	class MainClass
	{
		public static void Main(string[] args) {
			string s = "hello";
			Console.WriteLine("s = {0}", Upper(s));
		}

		public static string Upper(string s){
			return s.ToUpper();
		}
	}
}

今回は s に "hello" という値をセットしているので問題なく、次のように出力されます。

s = HELLO

しかし s が null であると、NullReferenceException が発生します。

このため、null に対してメソッドを呼ばないように、次のように null かどうかのチェックが必要です。

	public static string Upper(string s){
		if(s == null) {
			return null;
		}
		return s.ToUpper();
	}

しかし、こうした条件分岐は頻繁に必要とされるので、なかなか面倒です。

そこで登場したのが Null 条件演算子 (Null conditional operator) です。

上記と同様のコードは次のように記述できます。

	public static string Upper(string s){
		return s?.ToUpper();
	}

? が Null 条件演算子です。 ? によって、「s は null かもしれないよ。もし null だったら、次の処理はしないでね」 ということを記述できるようになります。

Mono - mcs と Visual C# でのコンパイル

Ubuntu 上の Mono C# コンパイラでコンパイルする場合、言語仕様バージョンが合わず Null 条件演算子がないと次のようなエラーが発生します。

$ mcs -langversion:5 foo.cs
foo.cs(14,12): error CS1644: Feature `null propagating operator' cannot be used 
because it is not part of the C# 5.0 language specification
Compilation failed: 1 error(s), 0 warnings

ここではC# のバージョン 5 を指定しています。解決方法はもちろんバージョン 6 以上を指定することです。

ちなみに Visual C# コンパイラ csc では /langversion オプションです。csc の時のエラーメッセージは次の通りです。

error CS8026: Feature 'null propagating operator' is not available in C# 5.
Please use language version 6 or greater.

英語表記が MS の資料と異なったので念のため追記でした。

ホーム > C# の基礎 > Null 条件演算子