三項演算子 VB vs C#: Nothing がゼロに解決されるのはなぜですか? [重複] 質問する

三項演算子 VB vs C#: Nothing がゼロに解決されるのはなぜですか? [重複] 質問する

私はただ自分の足を撃っているだけなので、この状況を可能にした実際の理由があったかどうかを知りたいのです。
いずれにせよ、この質問は、将来の足を撃つ人の便宜のために残しておくことができます。


vb.net に null 許容値があるとします。

Dim i as Integer?

条件に基づいて三項演算子を使用して値を割り当てたいと思います。とても便利です。

i = If(condition(), Nothing, 42)

つまり、条件が の場合はtruenull 値を使用し、そうでない場合は 値を使用します。その時点で発砲が起こります。明らかな理由もなく、VB コンパイラはとの共通基本型が である
と判断し、その時点でステートメントを次のように暗黙的に変換します。NothingIntegerInteger

i = If(condition(), 0, 42)

さて、これを C# で実行すると次のようになります。

i = (condition()) ? null : 42;

<null>すぐに、は とうまく混在しないというコンパイラ エラーが発生しますint。これは素晴らしいことです。今回 C# の方法を採用していれば、私の足はもっと健康だったでしょうから。そして、これをコンパイルするには、明示的に次のように記述する必要があります。

i = (condition()) ? null : (int?)42;

今あなたできるVB でも同じことを実行し、期待どおりの正しい null 値を取得します。

i = If(condition(), Nothing, CType(42, Integer?))

しかし、そのためにはまず足を撃たれる必要があります。コンパイラ エラーも警告もありません。これは および の場合Explicit OnですStrict On


それで、私の質問は、なぜですか?
これはコンパイラのバグとして捉えるべきでしょうか?
それとも、コンパイラがこのように動作する理由を誰か説明できますか?

ベストアンサー1

これは、VB がNothingC# と直接同等ではないためですnull

たとえば、C# では次のコードはコンパイルされません。

int i = null;

しかし、この VB.Net コードは問題なく動作します:

Dim i As Integer = Nothing

VB.Net の表現はNothing実際には C# のdefault(T)表現に近いものです。

おすすめ記事