投稿者 るきお  (社会人) 投稿日時 2021/2/26 08:48:13
If演算子の第2引数と第3引数は同じ型である必要があります。
たとえば、次のプログラムはコンパイルエラーとなり実行できません。

Dim ret As Boolean? = If(flag, True"ABC")


まこさん、提示されたコードの場合、第2引数が True 、第3引数が Nothing です。
Nothing なので型が不明瞭で、気になってどういう動作になるのか調べてみました。

この場合、第2引数が True なので、VBはこれを Boolean 型であると解釈していました。(ILSpyで確認しました。)
そして(わかりにくい点なのですが)、Nothingは自動的にBooleanである、False に変換されていました。

そのため、このプログラムは、
Dim ret As Boolean? = If(flag, TrueNothing)


VBにはこのように解釈されています。
Dim ret As Boolean? = If(flag, TrueFalse)


この動作はOption Strict Onでも発生します。

やりたいことを実現するには普通の If を使うことになりそうです。
If flag Then
    ret = True
End If



ちなみに C# では従来下記プログラムはコンパイルエラーで実行できませんでした。
bool? ret = flag ? true : null;


しかし、最新のC# 9.0 からは実行でき、flag が falseの場合、うまく ret は null になります。