Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

C#辞典

  1. トップページ
  2. C#辞典
  3. is / as / パターンマッチ

is / as / パターンマッチ

オブジェクトの型を判定する『is』と安全にキャストする『as』、C# 8以降で強化されたパターンマッチング(switch式・whenガード)です。

構文
// 型を判定します(true/false)。
bool 結果 = オブジェクト is 型;

// 型を判定して変数に代入します(パターン変数)。
if (オブジェクト is 型 変数名) { ... }

// 安全なキャストです(失敗すると null を返します)。
型 変数 = オブジェクト as 型;

// switch 式によるパターンマッチングです。
string 結果 = 変数 switch {
	型1 v => ...,
	型2 v when 条件 => ...,
	_ => デフォルト
};
構文一覧
構文概要
obj is 型obj が指定した型かどうかを bool で返します。null には false を返します。
obj is 型 v型が一致すると変数 v に代入します(型パターン変数)。C# 7以降で使えます。
obj as 型型変換を試みます。失敗すると例外の代わりに null を返します。値型には使えません。
switch 式C# 8以降。各ケースをアロー(=>)で書き、値を返す式として使います。
when ガードswitch の case に追加条件を付けます。
サンプルコード
using System;

// is で型判定します。
object 値 = "Hello";
if (値 is string テキスト) {
	Console.WriteLine($"文字列: {テキスト.ToUpper()}"); // HELLO
}

// as で安全にキャストします。
object 数値 = 42;
string 文字 = 数値 as string; // 失敗してもクラッシュしない
Console.WriteLine(文字 == null ? "変換失敗" : 文字); // 変換失敗

// switch 式でパターンマッチングします。
object[] テスト = { 42, "abc", 3.14, true, null };
foreach (object item in テスト) {
	string 説明 = item switch {
		int n when n > 100 => $"大きな整数: {n}",
		int n             => $"整数: {n}",
		string s          => $"文字列: {s}",
		double d          => $"小数: {d}",
		bool b            => $"真偽値: {b}",
		null              => "null です",
		_                 => "不明な型"
	};
	Console.WriteLine(説明);
}
概要

C# 7以降の『is』は型チェックと変数代入を同時に行えるため、is で判定した後に別途キャストする書き方は不要になりました。if (obj is string s) のように一行で書くのが現代的なスタイルです。

『as』は参照型のキャストに使えますが、値型(int・structなど)には使えません。キャスト失敗が確認できないまま使うとその後の null 参照で例外になります。必ず null チェックを行ってください。

null のデフォルト値設定は『null合体演算子 ?? / ??=』を参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。