読者です 読者をやめる 読者になる 読者になる

VB.NET、いくつかの場所で単純なロジックを眺めててコレって三項演算子使った方が見やすいよなぁでもVB三項演算子なんかないしなぁ、と思ったけど試しにググったら、どうやらIF関数なるものがあるらしいです。
三項演算子と同じパラメータで三項演算子と同じ出力結果を返す、という触れ込みの関数なのでこれで見通しが良くなるな、と思って早速書き換えてテストしたら‥‥、なんかこれ出力がおかしいんデスが。

Private Sub assignListCur(ByRef aDestList As IList(Of Decimal?), ByVal aSrcList As IList(Of Decimal?))
    aDestList.Clear()
    For Each curValue As Decimal? In aSrcList
        If curValue Is Nothing Then
            aDestList.Add(Nothing)
        Else
            aDestList.Add(0)
        End If
    Next
End Sub

Private Sub assignListNew(ByRef aDestList As IList(Of Decimal?), ByVal aSrcList As IList(Of Decimal?))
    aDestList.Clear()
    For Each curValue As Decimal? In aSrcList
        aDestList.Add(If(curValue Is Nothing, Nothing, 0))
    Next
End Sub

ってやると、assignListCurではNothingが入ってて.ToStringすると空文字が出力されていたリストの要素が、assignListNewでは何故か0が出力されるという。
しょうが無いのでデバッガでチェックしたら‥‥、

If(true, Nothing, 10)

が0とか言ってるよ orz

Dim curValue as Decimal? = Nothing
If(curValue, Nothing)

curValue = 10
If(curValue, Nothing)

はそれぞれ、Nothingと10が返ってくるんですが、今回必要な値はcurValueではなく固定値なのでこっちの引数は使えません。

Private Sub assignListNew(ByRef aDestList As IList(Of Decimal?), ByVal aSrcList As IList(Of Decimal?))
    aDestList.Clear()
    For Each curValue As Decimal? In aSrcList
        aDestList.Add(If(curValue = 0, 0, 1))
    Next
End Sub

はちゃんと動くので、どうもNull許容型とNothingの評価がちゃんと出来ていない感じですな。
コンパイラが単純にIF〜Then〜Elseに展開しているだけならこんな風にならないと思うのですが、ジェネリックをかまして変換してそれがコケてるのか?
なんとも。