投稿者 魔界の仮面弁士  (社会人) 投稿日時 2021/2/26 11:48:17
>> If演算子の第2引数と第3引数は同じ型である必要があります。

If 演算子のこの動作は、「共通型の推論」と呼ばれています。

「同じ型」ならばもちろん問題無いわけですが、より正確に言えば、
  『一方が他方に対する拡大変換を持つ必要がある』
ということになります。

If(f, CByte(1), CInt(2)) などは OK ですが、
If(f, CByte(1), CSByte(2)) の場合は NG ですね。


🆗拡大解釈なので、If 演算子が動作します。
Option Strict On
Module Module1
    Sub Main()
        Dim スライム As New Slime()
        Dim メタルスライム As New MetalSlime()
        Dim f As Boolean = False

        'monser As Slime としてコンパイルされる 
        Dim monster = If(f, スライム, メタルスライム)
    End Sub
End Module

Class Slime
End Class
Class MetalSlime
    Inherits Slime
    Implements IMetalic
End Class
Interface IMetalic
End Interface



🆖縮小変換になるので、共通型を推論できません。
Option Strict On
Module Module1
    Sub Main()
        Dim スライム As New Slime()
        Dim メタルスライム As New MetalSlime()
        Dim f As Boolean = False

        'エラー BC36912: 共通型を推論できません。Option Strict On が設定されているため、 
        '                'Object' と見なすことはできません。 
        Dim monster As ISlime = If(f, スライム, メタルスライム)
    End Sub
End Module

NotInheritable Class Slime
    Implements ISlime
End Class
NotInheritable Class MetalSlime
    Implements ISlime, IMetalic
End Class
Interface ISlime
End Interface
Interface IMetalic
End Interface