【发布时间】:2021-09-27 11:17:15
【问题描述】:
为什么 CType 抱怨 (InvalidCastException) 获取对象(实际上是 Int32?)并将其转换为 Int64??
我发现CTypeDynamic 没有问题(不过是切题,因为我关注的是Ctype)。
这里是重现场景的代码示例。
Module Module1
Sub Main()
Dim i As Int32? = 1234567891
'manual nullable -> non nullable -> non nullable -> nullable
'per https://stackoverflow.com/a/10065482/392175
Dim iNotNullable As Int32 = i.Value
Dim biNotNullable As Int64 = iNotNullable
Dim bi As Int64? = biNotNullable
Console.WriteLine($"---Manual results---")
Console.WriteLine($"i={i}")
Console.WriteLine($"bi={bi}")
'CType investigation
bi = Module1.xCType(Of Int64?)(i)
Console.WriteLine($"---CType results---")
Console.WriteLine($"i={i}")
Console.WriteLine($"bi={bi}")
Console.ReadLine()
End Sub
Public Function [xCType](Of T)(ByVal obj As Object) As T
If obj Is Nothing Then Return Nothing
If IsDBNull(obj) Then Return Nothing
Return obj 'fails
Return CType(obj, T) 'fails
Return CTypeDynamic(Of T)(obj) 'succeeds
End Function
End Module
【问题讨论】:
-
一个有趣的问题,阅读文档和这个线程 stackoverflow.com/questions/10065452/… 在我看来,在类型转换方面,可空对象并不是那么明确。
-
@Hursey 似乎来自另一个线程的此语句“否则,转换被评估为从 S? 到 S 的展开,然后是从 S 到 T 的基础转换,然后是包装(§ 4.1.10) 从 T 到 T?"将是道路和成功。
-
@Hursey 我已更新问题以包含您提到的 stackoverflow 帖子中描述的手动路径,以对比手动路径有效。即 Int32? -> Int32 -> Int64 -> Int64?
-
@Hursey:
vb.net有它自己的规则,它不仅仅是 C#-with-a-more-verbose-syntax -
@Hursey C# 在返回 (T)obj 时表现相同;
标签: .net vb.net generics nullable ctype