5

重複の可能性:
バグ?? 三項演算子を介して null 許容整数に値を代入すると、null にならない

この質問は多くの質問と重複しているように見えるかもしれませんが、実際には特定の理由で質問されています。たとえば、次のコードを使用します。

Dim n As Integer? = If(True, Nothing, 1)

そのコードでは、三項式は Nothing を返す必要がありますが、n を 0 に設定しています。これが C# の場合、default(int?)完璧に機能すると言えます。三項を捨てて通常の If ブロックを使用する必要があるように見えますが、実際には三項を使用したいと考えています。

C# のデフォルトに相当する VB.NET がまったくない場合、この動作をどのように説明できますか?

4

1 に答える 1

6

C# に相当するVB.NETdefaultキーワードNothingです。Id.Value値を返す限り、記述したコードは正常にコンパイルされるはずIntegerです。

更新されたサンプルがうまくいかない理由は、の性質によるものですNothing。VB.NETNothingでは空の値であり、任意の型に変換できます。If式の場合、コンパイラは戻り値の型を推測する必要があります。これは、2 つの値の引数を調べることによって行われます。

Nothingには型がありませんが、リテラル1には型がありIntegerます。Nothingは変換可能でIntegerあるため、コンパイラIntegerはここで最適な型であると判断します。これは、が値として選択された場合、 ではなくNothingとして解釈されることを意味します。IntegerInteger?

これを修正する最も簡単な方法は1Integer?.

Dim n As Integer? = If(True, Nothing, CType(1, Integer?))
于 2012-04-19T18:46:16.747 に答える