在VB.Net中抛出奇怪的事物

时间:2018-06-14 21:44:18

标签: .net vb.net casting

所以我正在使用一些代码,这些代码需要从BigInteger检索到DictionaryLong的强制转换。我原本把它写在一行这样:

Dim Length As Long = If(Dict.ContainsKey("key"), CLng(Dict("key")), 0)

这总是给我一个错误,说明从BigIntegerLong的转换无效。似乎没有什么能解决问题,直到我把事情分开。

完全错误:

System.InvalidCastException was caught
  HResult=-2147467262
  Message=Conversion from type 'BigInteger' to type 'Long' is not valid.
  Source=Microsoft.VisualBasic 
  StackTrace:
   at Microsoft.VisualBasic.CompilerServices.Conversions.ToLong(Object Value)
   at CMIS.CmisImport.RegisterResult(String BaseTypeId, Dictionary`2 Props) in C:\Source\Main\CMIS\Import Export\CmisImport.vb:line 265
   at CMIS.CmisImport.ProcessResult(IObjectData Result) in C:\Source\Main\CMIS\Import Export\CmisImport.vb:line 91
   at CMIS.CmisImport.RunOperation() in C:\Source\Main\CMIS\Import Export\CmisImport.vb:line 65
   at Core.ImportProvider.StartOperation(Boolean ImportBatch) in C:\Source\Main\Core\Support Classes\Import-Export Providers\ImportProvider.vb:line 140
   at Core.frmProviderImport.Worker_DoWork(Object sender, DoWorkEventArgs e) in C:\Source\Main\Core\UI\Forms\frmProviderImport.vb:line 164
 InnerException:

此:

Dim temp as BigInteger
If (Dict.ContainsKey("key")) Then
    temp = Dict("key")
Else
    temp = 0
End If

Dim Length As Long = CLng(temp)

以某种方式实现了我想要的行为,但我似乎无法弄清楚CLng在一行上失败的原因。我只是想知道为什么第一行代码失败,第二行代码成功。

1 个答案:

答案 0 :(得分:0)

对于那些无法重新创建错误的人,原因是:

Dim dict As New Dictionary(Of String, Object)

如果字典的值为键入,则不会发生错误,但如果它是对象,则实际类型是后期绑定的,并以某种方式导致此错误。

我能想到的唯一情况是“在实际代码中”会发生这种情况将使用旧式反序列化,在这种情况下,你经常在假定类型的同时兼顾(对象,对象)的字典。对BigInteger来说,似乎需要进行一些显式转换。

也许在system.numerics库的某个深处有一个Narrowing转换但没有扩展转换。