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万円
東京都新宿区(西新宿駅)