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

继达米安的回答之后,这样做的干净方法是使用NothingNew 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

这一切都归结为表达式的类型分析。

Nothing是VB.Net中的一个魔兽。它与 C# 中的大致相同default(T)

因此,在尝试确定以下内容的最佳类型时:

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

第三个参数是 type Double。第二个参数可转换为Double(因为Nothing可以返回值类型的默认值)。因此, 的返回值的类型If被确定为Double

只有该类型分析结束后,才需要注意分配此表达式的变量的类型。并且Double可以分配给Double?没有任何警告。


没有干净的方法可以让你的If()表达方式达到你的预期。null因为在 VB.Net 中没有等价物。您需要(至少)在DirectCast的潜在结果的一侧或另一侧插入(或等效)If以强制类型分析查看Double?而不是Double.

于 2013-01-31T19:47:31.217 回答