私はただ自分の足を撃ち、この状況を可能にする実際の理由があったかどうか知りたいです。
そしてとにかく、この質問は将来のフットシューターの便宜のためにとどまることができます。
vb.netにnull許容値があるとします。
Dim i as Integer?
条件に基づいて、三項演算子を使用して値を割り当てたいと思います。これは、非常に優れているためです。
i = If(condition(), Nothing, 42)
つまり、条件がtrue
である場合はnull可能性を使用し、そうでない場合は値を使用します。
その時点で射撃が行われます。明らかな理由はありませんが、VBコンパイラはとの共通ベースタイプを決定します。Nothing
その時点で、VBコンパイラはステートメントを次のようにサイレントに変換しますInteger
。Integer
i = If(condition(), 0, 42)
さて、これをC#で行う場合:
i = (condition()) ? null : 42;
<null>
とうまく混ざらないというコンパイラエラーがすぐに発生しint
ます。今回はC#の方法で行っていたら、足が健康だったので、これは素晴らしいことです。そして、これをコンパイルするには、明示的に次のように記述する必要があります。
i = (condition()) ? null : (int?)42;
これで、 VBでも同じことができ、期待する正しいヌルネスを取得できます。
i = If(condition(), Nothing, CType(42, Integer?))
しかし、そもそも足を撃たなければなりません。コンパイラエラーや警告はありません。それはExplicit On
とStrict On
です。
だから私の質問は、なぜですか?
これをコンパイラのバグと見なす必要がありますか?
または、コンパイラがこのように動作する理由を誰かが説明できますか?