はじめに
C#7.0からis演算子で変数の型を判定したのちに、判定した型にキャストをした変数を宣言することが可能となりました。
ただ、宣言した変数のスコープが想定通りでないことがあったので、記事にまとめました。
スコープが想定通りである例
if文内でis演算子を使って、指定の型である場合はキャストして新たに変数を宣言する場合を考えます。
以下の①の処理は、変数を宣言したif文のスコープ内なので、コンパイルが通ることは直感的に分かります。
// 変数objがstring型であるならばキャストして変数strとして定義
if(obj is string str)
{
// ①ifのスコープ内なので変数strが利用可能
Console.WriteLine(str);
}
スコープが想定通りでなかった例
if文内でis演算子を使って、指定の型でない場合はreturnし、指定の型の場合はキャストした変数を宣言する場合を考えます。
以下の①の処理は、変数を宣言したif文のスコープ外ですが、コンパイルが通ります。
// 変数objがstring型であるならばキャストして変数strとして定義し、
// 変数objがstring型でないならreturnする
if(!(obj is string str)) return;
// ①if文のスコープ外であるはずだが、変数strが利用できる
Console.WriteLine(str);
これは言語仕様のようで、こちらの記事に詳しく書かれています。上記のような利用方法が多いため、スコープ外でも変数にアクセスできる仕様にしたとのことです。
私自身以下のようにis演算子で型判定をして型一致しなかったらreturnし、その後キャストするという書き方しかできないと思い込んでいましたが、上記の書き方のほうがすっきりかけるのでぜひ活用していきたいですね。
// 変数objがstring型でないならreturnする
if(!(obj is string)) return;
// if文の判定後にキャスト
string str = (string)obj;
Console.WriteLine(str);