
C#でのobjectのキャストについて詳しく解説!
- SE
- objectのキャストとはどういったものがあるのでしょう。
- PM
- キャストとは値の変換という意味です。ここでは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 演算子を使用したキャストも可能です。
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 |
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 演算子を使用すれば、チェックと同時にキャストすることもできます。
- SE
- アップキャストにダウンキャスト、実際にソースコードを書いてみるとより理解できそうですね。
- PM
- そうですね。演算子を用いたソースコードもご紹介しましたので参考にしながらより理解を深めてください。
C#でobjectをキャストしましょう
いかがでしたでしょうか。アップキャストやダウンキャスト、as 演算子、is 演算子の使い方についてご説明しました。
ぜひご自身でソースコードを書いて、理解を深めていきましょう。