https://ooltcloud.sakura.ne.jp/blog/201406/article_11235313.html を改良してみた。修正点は以下。
- Either を Interface から Super Class に変えた。
- Either に Match メソッドを追加した。
Class Either(Of A, B)
    Protected _right As A
    Protected _left As B
    Sub Match(Right As Action(Of A), Left As Action(Of B))
        Select Case Me.GetType
            Case GetType(Right(Of A, B))
                Right(_right)
            Case GetType(Left(Of A, B))
                Left(_left)
        End Select
    End Sub
End Class
Class Right(Of A, B)
    Inherits Either(Of A, B)
    Sub New(obj As A)
        _right = obj
    End Sub
End Class
Class Left(Of A, B)
    Inherits Either(Of A, B)
    Sub New(obj As B)
        _left = obj
    End Sub
End Class
こうすることで使用側のコードは多少すっきりした…と思う(汗
Enum ErrorCode
    SyntaxError
End Enum
Module Module1
    Sub f(obj As Either(Of Tuple(Of Integer, Integer), ErrorCode))
        Dim isSucess = False
        Dim y As Double = 0
        obj.Match(Right:=Sub(x)
                             isSucess = True
                             y = x.Item1 + x.Item2
                         End Sub,
                   Left:=Sub(x)
                             isSucess = False
                             Console.WriteLine(x.ToString)
                         End Sub)
        If isSucess = False Then Exit Sub
        Console.WriteLine("{0}", y)
    End Sub
    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 続行するには何かキーを押してください . . .
まあこれだと使えないことはないか…な?(汗