Either 型っぽいものが VB で実装できないか、ちょっと試してみた。
' Either型 Interface Either(Of A, B) End Interface ' Either.Right型 Class Right(Of A, B) Implements Either(Of A, B) Private _obj As A Sub New(obj As A) _obj = obj End Sub Public Function GetValue() As A Return _obj End Function End Class ' Either.Left型 Class Left(Of A, B) Implements Either(Of A, B) Private _obj As B Sub New(obj As B) _obj = obj End Sub Public Function GetValue() As B Return _obj End Function End Class
' エラーコード用 Enum
Enum ErrorCode
    NoError
    SyntaxError
End Enum
Module Module1
    ' Either型の評価(実処理)
    Sub f(a As Either(Of Tuple(Of Integer, Integer), ErrorCode))
        Select Case a.GetType
            Case GetType(Right(Of Tuple(Of Integer, Integer), ErrorCode))
                Dim b = CType(a, Right(Of Tuple(Of Integer, Integer), ErrorCode))
                Dim c = b.GetValue
                Console.WriteLine(c.Item1 + c.Item2)
            Case GetType(Left(Of Tuple(Of Integer, Integer), ErrorCode))
                Dim b = CType(a, Left(Of Tuple(Of Integer, Integer), ErrorCode))
                Console.WriteLine(b.GetValue.ToString)
        End Select
    End Sub
    ' Main
    Sub Main()
        Dim a = New Right(Of Tuple(Of Integer, Integer), ErrorCode)(Tuple.Create(100, 200))
        f(a)
        Dim b = New Left(Of Tuple(Of Integer, Integer), ErrorCode)(ErrorCode.SyntaxError)
        f(b)
    End Sub
End Module
結果
300 SyntaxError 続行するには何かキーを押してください . . .
なんとなく似たようなものはできたけど、型名の記述ばかりで処理が見えない…。煩雑で使い物にならないですね(汗
これなら Tuple の第一引数にエラーコードを埋める形のほうが、まだスマートな感じです(汗
Module Module1
    ' 評価(実処理)
    Sub f(a As Tuple(Of ErrorCode, Integer, Integer))
        Select Case a.Item1
            Case ErrorCode.NoError
                Console.WriteLine(a.Item2 + a.Item3)
            Case Else
                Console.WriteLine(a.Item1.ToString)
        End Select
    End Sub
    ' Main
    Sub Main()
        Dim a = Tuple.Create(ErrorCode.NoError, 100, 200)
        f(a)
        Dim b = Tuple.Create(ErrorCode.SyntaxError, 0, 0)
        f(b)
    End Sub
End Module
			
[VB.NET] VB で Either 型 (その2) | オールトの雲
[…] [VB.NET] VB で Either 型 […]
Link | 2014年6月11日 23:59