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に展開しているだけならこんな風にならないと思うのですが、ジェネリックをかまして変換してそれがコケてるのか?
なんとも。