C#:型変換の落とし穴を回避!直接キャストと「as」演算子の選び方
C#における直接キャストと「as」演算子の比較
直接キャスト
直接キャストは、括弧の中に型を指定してオブジェクトを変換する方法です。 例えば、string
型の変数をint
型に変換するには、以下のように記述します。
int number = (int) "123";
直接キャストは、成功した場合、変換後の値を直接使用できます。 ただし、変換が失敗すると、実行時エラーが発生します。
「as」演算子
「as」演算子は、オブジェクトを変換し、成功した場合のみ結果を変数に代入する方法です。 例えば、object
型の変数をstring
型に変換するには、以下のように記述します。
string text = obj as string;
「as」演算子は、変換が失敗してもエラーが発生せず、null
が代入されます。
使い分け
直接キャストと「as」演算子は、以下の点で使い分けられます。
- 変換の成功が確実な場合: 直接キャストを使用します。
- null許容参照型を使用する場合: 「as」演算子を使用します。
例
以下の例では、直接キャストと「as」演算子の使い分けを示しています。
// 直接キャスト
string str = "123";
int number = (int) str; // 成功
// "as"演算子
object obj = 123;
string text = obj as string; // 失敗
// null許容参照型
string? name = null;
string? upperName = name?.ToUpper(); // null許容参照型とas演算子の併用
using System;
public class Sample
{
public static void Main(string[] args)
{
// 直接キャスト
string str = "123";
int number = (int)str; // 成功
Console.WriteLine(number); // 123
// "as"演算子
object obj = 123;
string text = obj as string; // 失敗
Console.WriteLine(text); // null
// null許容参照型
string? name = null;
string? upperName = name?.ToUpper(); // null許容参照型とas演算子の併用
Console.WriteLine(upperName); // null
// 例外処理
try
{
// 明示的なキャスト
int invalidNumber = (int)"abc";
}
catch (InvalidCastException e)
{
Console.WriteLine(e.Message); // "文字列 'abc' は、型 'System.Int32' に変換できません。"
}
// "as"演算子による安全なキャスト
object obj2 = "abc";
int? safeNumber = obj2 as int?;
Console.WriteLine(safeNumber); // null
}
}
このコードを実行すると、以下の出力が得られます。
123
null
null
文字列 'abc' は、型 'System.Int32' に変換できません。
null
IConvertible
インターフェースを実装しているオブジェクトは、ToXXX()
メソッドを使用してさまざまな型に変換できます。 例えば、string
型のオブジェクトをint
型に変換するには、以下のように記述します。
string str = "123";
int number = (int)Convert.ChangeType(str, typeof(int));
IConvertible
インターフェースは、多くの標準型でサポートされています。
ジェネリック型変換
ジェネリック型変換を使用して、オブジェクトを別の型に変換できます。 例えば、List<string>
型のオブジェクトをList<int>
型に変換するには、以下のように記述します。
List<string> stringList = new List<string>() { "1", "2", "3" };
List<int> intList = stringList.Select(x => int.Parse(x)).ToList();
ジェネリック型変換は、複雑な型変換に役立ちます。
特定の種類のオブジェクト変換に特化したライブラリもあります。 例えば、JSONとオブジェクト間の変換には、Newtonsoft.Json
ライブラリを使用できます。
c# casting