DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

自作クラス型を別の型にキャスト(変換)できるようにする

注意:ここで説明している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型への変換は明示的に行えるようにしています。

VB.NET
コードを隠すコードを選択
'テストのためのクラス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
C#
コードを隠すコードを選択
//テストのためのクラス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のような例外をスローする可能性があります。

実際に型変換が行えるようになったことは、次のようなコードで確認できます。

VB.NET
コードを隠すコードを選択
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)
C#
コードを隠すコードを選択
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);

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • .NET Tipsをご利用いただく際は、注意事項をお守りください。