2012-04-19 11 views
5

可能性の重複:
Bug?? If you assign a value to a nullable integer via a ternary operator, it can't become nullVB.NETのC#のデフォルトキーワードと同じものは何ですか?

この質問は、多くの重複のように見えるかもしれませんが、それは実際には特別な理由のために要求されています。例えば、このコードを取る:そのコードで

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

を、三元表現何も返すべきであるが、これはC#のであれば、それは0に設定Nだ、私はdefault(int?)を言うことができる、それが完璧に動作します。今では、私は3進法をディッチし、通常のIfブロックを使用する必要があるように見えますが、私は本当に3値を使用したいと思います。

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

+0

'Nothing'は' default(int) 'と等価です。なぜなら、式に基づく推論型は' int'ではなく 'int'ですからです。これは 'If(true、Nothing、new Integer?(1))'で表示されます。 – Marc

+0

VB.NET *にはC#のデフォルトと同等のものはありません。そうであれば、タイプ推論を使用してNothingがnullの整数のデフォルト値であるNothing、つまり0ではないと判断できる可能性があります。 – oscilatingcretin

+0

間接的には正しいです。 C#では、 'default'は型を取ります。これは推論に使用できます。 VBでは、Nothingはこの中で受動的な役割を果たしているようです。 – Marc

答えて

6

VB.NETは、C#のdefaultに相当し、キーワードはNothingです。 Id.ValueIntegerの値を返す限り、あなたが書いたコードはちゃんとコンパイルする必要があります。

更新されたサンプルが間違っている理由は、性質がNothingであるためです。 VB.NETでNothingは空の値で、どのタイプにも変換可能です。今度はIf式の場合、コンパイラは戻り値の型を推測しなければなりません。また、2つの値引数を調べることでコンパイラはこれを行います。

Nothingには型はありませんが、1の型はIntegerです。 NothingIntegerに変換されるので、コンパイラはIntegerが最良のタイプであると判断します。これは、値としてNothingが選択された場合、Integerと解釈され、Integer?ではなく解釈されることを意味します。

これを修正する最も簡単な方法は、として扱われるように、コンパイラに1を明示的に伝えることです。

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

私の質問では、私は正しく三項式でNothingを使用していますか?もしそうでなければ、私は何をしようとしているのですか?万一、あなた自身のコードを使用して問題を再現しようとしましたか? – oscilatingcretin

+0

@scilatingcretinあなたが使用しているコードはうまくいきます。ローカルでサンプルを書いて、それが期待どおりに機能しました – JaredPar

+0

さて、私の質問に編集された更新されたコードを試してみてください。その1行のコードを実行すると、 'n'は期待通りにNothingに設定されますか?私がそれを実行すると、0に設定されています。 – oscilatingcretin

関連する問題