7

次のコードが与えられます:

Dim widthStr As String = Nothing

これwidthは機能します-割り当てられNothingます:

Dim width As Nullable(Of Double)
If widthStr Is Nothing Then
  width = Nothing
Else
  width = CDbl(widthStr)
End If

しかし、これはそうではありません-widthになります0.0(論理的に同一のコードのように見えますが):

Dim width As Nullable(Of Double) = If(widthStr Is Nothing, Nothing, CDbl(widthStr))

なんで?それを機能させるために私にできることはありますか?

4

2 に答える 2

12

ダミアンの答えに加えて、これを行うためのクリーンな方法は、を使用しないNothingことですが、New Double?代わりに:

Dim width As Double? = If(widthStr Is Nothing, New Double?, CDbl(widthStr))

そして、式のタイプIfが正しいので、これは次のように減らすことができます。

Dim width = If(widthStr Is Nothing, New Double?, CDbl(widthStr))
于 2013-02-02T16:14:52.327 に答える
5

これはすべて、式の型分析に帰着します。

NothingVB.Netの魔法の獣です。default(T)C#とほぼ同じです。

そのため、次の場合に最適なタイプを決定しようとすると、次のようになります。

If(widthStr Is Nothing, Nothing, CDbl(widthStr))

3番目の引数はタイプDoubleです。2番目の引数はに変換可能です(値型のデフォルト値を返すことができるDoubleため)。Nothingそのため、の戻り値のタイプはであるIfと判断されますDouble

その型分析が終了した後でのみ、この式が割り当てられている変数の型に注意が払われます。そして、警告なしDoubleにに割り当てることができます。Double?


表現を期待どおりに機能させるためのクリーンな方法はありませんIf()nullVB.Netに相当するものがないためです。(少なくとも)DirectCastの潜在的な結果のいずれかの側または別の側に(または同等の)を挿入しIfて、型分析に。Double?ではなく強制的に表示させる必要がありDoubleます。

于 2013-01-31T19:47:31.217 に答える