注意:ここで説明しているVB.NETのOperatorステートメントは、.NET Framework 2.0以降でのみ使用できます。
自作のクラス(あるいは構造体)型を別の型にキャスト(変換)できるようにするには、VB.NETではOperatorステートメント、C#ではoperatorキーワードを使って、ユーザー定義型変換演算子を定義します。そして、VB.NETでは、暗黙の型変換(拡大変換)にWideningキーワードを、明示的な型変換(縮小変換)にNarrowingキーワードを付けます。C#では、暗黙の型変換にimplicitキーワードを、明示的な型変換にexplicitキーワードを付けます。
暗黙の型変換では、キャスト式を使用する必要ありません。明示的な型変換では、キャスト式を使用する必要があります。詳しくは、こちらをご覧ください。
早速ですが、ユーザー定義型変換演算子を定義する例を示します。ここでは2つのクラス"TestClass"と"TestClassF"を作成し、それぞれの型をもう片方の型に変換できるようにしています。TestClass型からTestClassF型への変換は暗黙に、TestClassF型からTestClass型への変換は明示的に行えるようにしています。
'テストのためのクラス1 Public Class TestClass Public Number As Integer Public Sub New(ByVal num As Integer) Me.Number = num End Sub 'TestClass型からTestClassF型への変換演算子を定義する Public Shared Widening Operator CType(ByVal val As TestClass) As TestClassF Return New TestClassF(val.Number) End Operator End Class 'テストのためのクラス2 Public Class TestClassF Public Number As Single Public Sub New(ByVal num As Single) Me.Number = num End Sub 'TestClassF型からTestClass型への変換演算子を定義する Public Shared Narrowing Operator CType(ByVal val As TestClassF) As TestClass Return New TestClass(CInt(val.Number)) End Operator End Class
//テストのためのクラス1 public class TestClass { public int Number; public TestClass(int num) { this.Number = num; } //TestClass型からTestClassF型への変換演算子を定義する public static implicit operator TestClassF(TestClass val) { return new TestClassF(val.Number); } } //テストのためのクラス2 public class TestClassF { public float Number; public TestClassF(float num) { this.Number = num; } //TestClassF型からTestClass型への変換演算子を定義する public static explicit operator TestClass(TestClassF val) { return new TestClass((int)val.Number); } }
暗黙の変換では例外をスローしてはいけません。明示的な変換ではOverflowExceptionのような例外をスローする可能性があります。
実際に型変換が行えるようになったことは、次のようなコードで確認できます。
Dim c As New TestClass(1) 'TestClass型をTestClassF型に変換する Dim cf As TestClassF = c '確認 Console.WriteLine(cf.Number) Dim cf2 As New TestClassF(100.5F) 'TestClassF型をTestClass型に変換する Dim c2 As TestClass = CType(cf2, TestClass) '確認 Console.WriteLine(c2.Number)
TestClass c = new TestClass(1); //TestClass型をTestClassF型に変換する TestClassF cf = c; //確認 Console.WriteLine(cf.Number); TestClassF cf2 = new TestClassF(100.5f); //TestClassF型をTestClass型に変換する TestClass c2 = (TestClass)cf2; //確認 Console.WriteLine(c2.Number);
注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。