2012-09-14 326 views
3

我目前正在和一個老的api做鬥爭,而且我面臨以下問題:當我嘗試將對象數組強制轉換爲對象數組時,我得到了運行時異常日期。將對象強制轉換爲可空對象的對象()

Module Module1 
    Sub Main() 
     Console.WriteLine(Misc.dateCast(New Nullable(Of DateTime)())) 
     Console.WriteLine(Misc.tabledateCast(New Nullable(Of DateTime)() {New DateTime()})) 
    End Sub 
End Module 

Module Misc 
    Function dateCast(ByVal val As Nullable(Of DateTime)) As Object 
     Return CType(val, Object) 
    End Function 

    Function tabledateCast(ByVal val As Object) As Object() 
     Return CType(val, IEnumerable(Of Object)).Cast(Of Object).ToArray 
    End Function 
End Module 

第一個演員正在工作,但不是第二個。如何成功投射到對象數組?我不能使用CType(val, IEnumerable(Of Nullable(Of DateTime))),因爲函數可能會得到其他類型的數組。

+1

檢查[這](HTTP://計算器.COM /問題/ 4632313/CAS t-object-to-ienumerableobject)答案。顯然你可以投到'IEnumerable'而不是通用版本。 – Laoujin

回答

2

看起來你有兩個選擇:

1)如果這種陣列本身是類型安全的,可以泛化的方法,以便它知道鑄造一個對象之前投什麼 - 不是最好的代碼看,特別是在VB.NET:

Module Module1 
    Sub Main() 
     Console.WriteLine(Misc.tabledateCast(Of Nullable(Of DateTime))(New Nullable(Of DateTime)() {New DateTime()})) 
    End Sub 
End Module 

Module Misc 
    Function tabledateCast(Of T)(ByVal val As Object) As Object() 
     Return CType(val, IEnumerable(Of T)).Cast(Of Object).ToArray 
    End Function 
End Module 

2)Laoujin的鏈接,在你做一個非通用IEnumerable投第一:

Module Module1 
    Sub Main() 
     Console.WriteLine(Misc.tabledateCast(New Nullable(Of DateTime)() {New DateTime()})) 
    End Sub 
End Module 

Module Misc 
    Function tabledateCast(ByVal val As Object) As Object() 
     Return CType(val, IEnumerable).Cast(Of Object).ToArray 
    End Function 
End Module