所以我正在使用一些代码,这些代码需要从BigInteger
检索到Dictionary
到Long
的强制转换。我原本把它写在一行这样:
Dim Length As Long = If(Dict.ContainsKey("key"), CLng(Dict("key")), 0)
这总是给我一个错误,说明从BigInteger
到Long
的转换无效。似乎没有什么能解决问题,直到我把事情分开。
完全错误:
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
在一行上失败的原因。我只是想知道为什么第一行代码失败,第二行代码成功。
答案 0 :(得分:0)
对于那些无法重新创建错误的人,原因是:
Dim dict As New Dictionary(Of String, Object)
如果字典的值为键入,则不会发生错误,但如果它是对象,则实际类型是后期绑定的,并以某种方式导致此错误。
我能想到的唯一情况是“在实际代码中”会发生这种情况将使用旧式反序列化,在这种情况下,你经常在假定类型的同时兼顾(对象,对象)的字典。对BigInteger来说,似乎需要进行一些显式转换。
也许在system.numerics库的某个深处有一个Narrowing转换但没有扩展转换。