3

在 VB 中,我对DirectCast值类型 ( double, int, ...) 有不同的行为,具体取决于间接数

DirectCast(nothing, Double)
return 0

但是,如果我尝试将诸如矩阵元素等于无的东西强制转换,则会出现异常

Dim pArray as Object() = { nothing, 1.5, 2.27, -3.0}
DirectCast(pArray(1), Double)  'work with no issue
DirectCast(pArray(0), Double)  'Exception : Cannot convert to double

以同样的方式:

Dim TestCasting as object = nothing
Directcast(TestCasting, double) 'Exception : Cannot convert to double 

我怎样才能使工作方式与工作方式DirectCast相同?pArray(0)DirectCast(nothing, double)


我的帖子是一个突出问题的示例,而无需担心其余代码。

要激动。这是一个可能引起一些问题的例子。让我们看一个随机表(没有主键或任何东西,但没关系):

TABLE [dbo].[IDENTIFICATION] (
    [USER_ID]        INT            IDENTITY (1, 1) NOT NULL,
    [PASSWORD]       NVARCHAR(50)   NULL,
    [EXPIRATION_D]   DATETIME       NOT NULL,
    [LAYOUT]         INT            NULL,
);

现在,我有一个返回 Object(,) 的方法

Dim pArray as Object(,)  = myconnection.GetSqlRequest("Select USER_ID, PASSWORD, EXPIRATION_D, LAYOUT from IDENTIFICATION where USER_ID = 3")

这可能会返回类似的内容,{ 3, "StackOverflow", New Date(2110,01,01), nothing} 因为布局是一个可选字段。

我可以这样做:

if pArray(0,3) is nothing then
   Layout = 0
Else 
   Layout = DirectCast(pArray(0,3), Double)
End if

但我的目标是做:

Layout = DirectCast(pArray(0,3))

主要是因为我正在重构我没有编写的代码的很大一部分,而且DirectCast(nothing, Double) return 0除了这种情况外,它让我感到困扰。

4

1 回答 1

4

这很简单:Nothing当你存储Doubles在数组中时不要使用,Object()当你真正想要存储双精度时不要使用 a。

Double?()等等,反正用 a 会更好。Nullables 可以用null/NothingThen 初始化,你根本不需要演员表。

Dim pArray As Double?() = {Nothing, 1.5, 2.27, -3.0}
Dim first = pArray(0)
If first.HasValue Then
    ' No, it's a Nullable(Of Double)/Double? without a value
End If

编辑根据您的原始问题。更好的问题是为什么这在 VB 中有效:

Dim d as Double = DirectCast(Nothing, Double) ' => 0.0

原因:Nothing在 VB.Net 中相当于default(T)C#:给定类型的默认值是 0,对于数字类型,Date.MinValue对于DateNothing(现在在 nullC# 中的含义)对于引用类型。

所以DirectCast(Nothing, Double)将被隐式转换为Double0。而Object()包含真正的对象,它是所有东西的占位符。但Nothing通常是任何对象的“未知”状态而不是双精度,因此DirectCast非常严格的状态失败。如果您将值更改为,它也会引发运行时错误-3.0-3因为它实际上是一个Integer.

长话短说,

使用CType而不是DirectCast那些转换,它会起作用。

Dim obj As Object() = {Nothing, 1.0, 2}
Dim d1 = CType(obj(0), Double) ' => 0.0
Dim d2 = CType(obj(1), Double) ' => 1.0
Dim d3 = CType(obj(2), Double) ' => 2.0
于 2013-01-02T11:45:52.167 回答