C#でのobjectのキャストについて詳しく解説!

- システム
エンジニア - objectのキャストとはどういったものがあるのでしょう。
- プロジェクト
マネージャー - キャストとは値の変換という意味です。ここでは2種類の方法について見ていきましょう。
C#でのobjectのキャストについて
今回は、C#でのobjectのキャストについてご説明します。
キャストするには、”()”を使用する方法と、as演算子を使用する方法があり、それぞれの違いについてご説明します。
C#でのobjectのキャストに興味のある方はぜひご覧ください。
アップキャスト
C#ではobjectのアップキャストができます。アップキャストとは、スーパークラスにキャストすることです。
実際のソースコードを見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
using System; namespace ConsoleApplication1 { public class SuperClass { public String hoge; } class SubClass : SuperClass { static void Main(string[] args) { SubClass subCls = new SubClass(); subCls.hoge = "hoge"; // objectにキャスト object obj = (object)subCls; // objectのアップキャスト SuperClass superCls = (SuperClass)obj; // 結果出力 Console.WriteLine(subCls.hoge); // hoge Console.WriteLine(superCls.hoge); // hoge } } } |
実行結果は以下のようになります。
1 2 |
hoge hoge |
サブクラスをobjectにキャストし、objectをスーパークラスにアップキャストしています。このように、C#ではobjectのアップキャストができます。
ダウンキャスト
C#ではobjectのダウンキャストができます。ダウンキャストとは、サブクラスにキャストすることです。
この場合、アップキャストしたものをダウンキャストしなければキャストは成功しません。
実際のソースコードを見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
using System; namespace ConsoleApplication1 { public class SuperClass { public String hoge; } class SubClass : SuperClass { static void Main(string[] args) { SubClass subCls = new SubClass(); subCls.hoge = "hoge"; // objectにキャスト object obj = (object)subCls; // objectのアップキャスト SuperClass superCls = (SuperClass)obj; // objectにキャスト object obj2 = (object)superCls; // objectのダウンキャスト SubClass subCls2 = (SubClass)obj2; // 結果出力 Console.WriteLine(subCls.hoge); // hoge Console.WriteLine(superCls.hoge); // hoge Console.WriteLine(subCls2.hoge); // hoge } } } |
実行結果は以下のようになります。
1 2 3 |
hoge hoge hoge |
ダウンキャスできていることが分かります。
では、ダウンキャストに失敗するとどうなるか見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
using System; namespace ConsoleApplication1 { public class SuperClass { public String hoge; } class SubClass : SuperClass { static void Main(string[] args) { try { SuperClass superCls = new SuperClass(); superCls.hoge = "hoge"; // objectにキャスト object obj = (object)superCls; // ダウンキャスト(例外が発生する) SubClass subCls = (SubClass)obj; // 結果出力 Console.WriteLine(subCls.hoge); Console.WriteLine(superCls.hoge); } catch (Exception e) { Console.WriteLine(e.GetType()); } } } } |
実行結果は以下のようになります。
1 |
System.InvalidCastException |
このように、C#ではobjectのダウンキャストができます。
キャストに失敗すると、InvalidCastExceptionが発生します。
as 演算子
C#では、キャストとよく似た動きをする演算子に「as演算子」があり、as 演算子は値型のキャストはできませんが、参照型のキャストができます。
実際のソースコードを見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
int i1 = (int)1; // int i2 = 1 as int; //コンパイルエラー。値型は as 演算子でキャストできない object obj1 = "hoge"; string str1 = (string)obj1; object obj2 = "hoge"; string str2 = obj2 as string; // 参照型はas演算子でキャストできる Console.WriteLine(str1); Console.WriteLine(str2); |
実行結果は以下のようになります。
1 2 |
hoge hoge |
参照型は as 演算子でキャストできますので、結果が同じになることが分かります。
では、as 演算子でキャストできないときの挙動を見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
using System; namespace ConsoleApplication1 { public class SuperClass { public String hoge; } class SubClass : SuperClass { static void Main(string[] args) { try { SuperClass superCls = new SuperClass(); superCls.hoge = "hoge"; // objectにキャスト object obj = (object)superCls; //SubClass subCls = (SubClass)obj; // ダウンキャスト(例外が発生する) SubClass subCls = obj as SubClass; // ダウンキャスト(nullになる) // 結果出力 Console.WriteLine(subCls == null); Console.WriteLine(superCls.hoge); } catch (Exception e) { Console.WriteLine(e.GetType()); } } } } |
実行結果は以下のようになります。
1 2 |
True hoge |
as 演算子でキャストできない場合、nullになります。
値型のキャスト
C#では例えば、int型をobject型に変換し、int型にキャストする場合、キャストは成功します。
1 2 3 4 5 6 7 8 9 |
int i = 12345; object obj = i; int j = (int)obj; Console.WriteLine(i); // 12345 Console.WriteLine(j); // 12345 |
しかし、double型をobject型に変換し、int型にキャストすると、例外が発生します。
1 2 3 4 5 6 7 8 9 |
double d = 1.23456; object obj = d; int i = (int)obj; // 例外が発生する Console.WriteLine(d); Console.WriteLine(i); |
このような場合は、Convertクラスを利用します。
1 2 3 4 5 6 7 8 9 |
double d = 1.2345; object obj = d; int i = Convert.ToInt32(obj); Console.WriteLine(d); Console.WriteLine(i); |
このように、C#ではConvertクラスを利用することで別の値型に変換(キャスト)できます。
is 演算子
C#には、あるオブジェクトが指定された型と互換性があるかをチェックする is 演算子があります。
実際のソースコードを見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
using System; namespace ConsoleApplication1 { public class SuperClass { public String hoge; } class SubClass : SuperClass { static void Main(string[] args) { SubClass subCls = new SubClass(); subCls.hoge = "hoge"; // objectにキャスト object obj = (object)subCls; // Superクラスを継承しているかチェック if (obj is SuperClass) { // objectのアップキャスト SuperClass superCls = (SuperClass)obj; // 結果出力 Console.WriteLine(subCls.hoge); // hoge Console.WriteLine(superCls.hoge); // hoge } } } } |
Superクラスを継承しているかチェックし、継承している場合はアップキャストします。
またC#では、is 演算子を使用したキャストも可能です。
using System;
namespace ConsoleApplication1
{
public class SuperClass
{
public String hoge;
}
class SubClass : SuperClass
{
static void Main(string[] args)
{
SubClass subCls = new SubClass();
subCls.hoge = "hoge";
// objectにキャスト
object obj = (object)subCls;
// objがSuperClassにキャストできた場合、superClsに格納する
if (obj is SuperClass superCls)
{
// 結果出力
Console.WriteLine(subCls.hoge); // hoge
Console.WriteLine(superCls.hoge); // hoge
}
}
}
}
このように、C#の is 演算子を使用すれば、チェックと同時にキャストすることもできます。
- システム
エンジニア - アップキャストにダウンキャスト、実際にソースコードを書いてみるとより理解できそうですね。
- プロジェクト
マネージャー - そうですね。演算子を用いたソースコードもご紹介しましたので参考にしながらより理解を深めてください。
C#でobjectをキャストしましょう
いかがでしたでしょうか。アップキャストやダウンキャスト、as 演算子、is 演算子の使い方についてご説明しました。
ぜひご自身でソースコードを書いて、理解を深めていきましょう。
FEnet.NETナビ・.NETコラムは株式会社オープンアップシステムが運営しています。
株式会社オープンアップシステムはこんな会社です
秋葉原オフィスには株式会社オープンアップシステムをはじめグループのIT企業が集結!
数多くのエンジニアが集まります。

-
スマホアプリから業務系システムまで
スマホアプリから業務系システムまで開発案件多数。システムエンジニア・プログラマーとしての多彩なキャリアパスがあります。
-
充実した研修制度
毎年、IT技術のトレンドや社員の要望に合わせて、カリキュラムを刷新し展開しています。社内講師の丁寧なサポートを受けながら、自分のペースで学ぶことができます。
-
資格取得を応援
スキルアップしたい社員を応援するために資格取得一時金制度を設けています。受験料(実費)と合わせて資格レベルに合わせた最大10万円の一時金も支給しています。
-
東証プライム上場企業グループ
オープンアップシステムは東証プライム上場「株式会社オープンアップグループ」のグループ企業です。
安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。
株式会社オープンアップシステムに興味を持った方へ
株式会社オープンアップシステムでは、開発系エンジニア・プログラマを募集しています。
年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
まずは話だけでも聞いてみたい場合もOK。お気軽にご登録ください。


C#新着案件New Job
システム開発/東京都新宿区/【WEB面談可/C#経験者/20代前半の方活躍中/経験1年以上の方活躍中】/在宅勤務
月給29万~34万円東京都新宿区(新宿駅)システム開発/東京都新宿区/【WEB面談可/C#経験者/20代後半~40代の方活躍中/経験年数不問】/在宅勤務
月給41万~50万円東京都新宿区(新宿駅)デバック、テスト項目の作成/神奈川県横浜市/【WEB面談可/C#経験者/20代前半の方活躍中/経験1年以上の方活躍中】/在宅勤務
月給29万~34万円神奈川県横浜市(桜木町駅)デバック、テスト項目の作成/神奈川県横浜市/【WEB面談可/C#経験者/20代後半~40代の方活躍中/経験年数不問】/在宅勤務
月給41万~50万円神奈川県横浜市(桜木町駅)基幹システム開発導入/東京都新宿区/【WEB面談可/C#経験者/20代前半の方活躍中/経験1年以上の方活躍中】/在宅勤務
月給29万~34万円東京都新宿区(西新宿駅)基幹システム開発導入/東京都新宿区/【WEB面談可/C#経験者/20代後半~40代の方活躍中/経験年数不問】/在宅勤務
月給41万~50万円東京都新宿区(西新宿駅)