Fl0*_*Fl0 3 vb.net types casting directcast
在VB中,根据间接寻址的数量,我DirectCast对值类型(double,, ...)有不同的行为int
DirectCast(nothing, Double)
return 0
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试将矩阵的元素转换为等于零,则会出现异常
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
Run Code Online (Sandbox Code Playgroud)
以同样的方式:
Dim TestCasting as object = nothing
Directcast(TestCasting, double) 'Exception : Cannot convert to double
Run Code Online (Sandbox Code Playgroud)
我怎样才能以同样的方式进行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,
);
Run Code Online (Sandbox Code Playgroud)
现在,我有一个返回 Object(,) 的方法
Dim pArray as Object(,) = myconnection.GetSqlRequest("Select USER_ID, PASSWORD, EXPIRATION_D, LAYOUT from IDENTIFICATION where USER_ID = 3")
Run Code Online (Sandbox Code Playgroud)
这可能会返回类似的内容,{ 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
Run Code Online (Sandbox Code Playgroud)
但我的目标是:
Layout = DirectCast(pArray(0,3))
Run Code Online (Sandbox Code Playgroud)
主要是因为我正在重构我没有编写的代码的很大一部分,也因为它让我烦恼,DirectCast(nothing, Double) return 0除了在这种情况下。
这很简单:Nothing当您存储Doubles在数组中时不要使用 a ,Object()当您真正想要存储双精度数时不要使用 a 。
等等,无论如何使用 a 会更好Double?()。Nullables 可以用以下方法初始化null/Nothing然后你根本不需要强制转换。
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
Run Code Online (Sandbox Code Playgroud)
根据您原来的问题进行编辑。更好的问题是为什么这在 VB 中有效:
Dim d as Double = DirectCast(Nothing, Double) ' => 0.0
Run Code Online (Sandbox Code Playgroud)
原因:Nothing在 VB.Net 中相当于default(T)在 C# 中:给定类型的默认值对于数字类型为 0,对于引用类型Date.MinValue为Dateand Nothing(现在在 C# 中的含义 )。null
因此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
Run Code Online (Sandbox Code Playgroud)