我不得不將 vb.net 專案從 .NetFramework 4 更新到 .NetFramework 4.7.2。在此程序中,以下代碼現在拋出錯誤
Dim actuatorModelsArr = DirectCast(retNumberList, Array) Dim
Dim actuatorModels = actuatorModelsArr.Cast(Of ACTUATORMODELS)().ToList()
錯誤是System.ArrayTypeMismatchException: Source array type cannot be assigned to destination array type.
retNumberList 是一個整數陣列 ACTUATORMODELS 是一個列舉
在 .netFramework 4 版本 actuatorModels 是列舉 {System.Collections.Generic.List`1[FisherIECLib.ACTUATORMODELS]} 的串列
該串列稍后在模塊中通過 linq 用于獲取其中一個列舉作為回傳值。
有沒有辦法解決這個問題或創建列舉串列的方法?
在此先感謝,漢克
uj5u.com熱心網友回復:
我認為它停止作業很有趣。您可以用 Select 和 cast 替換代碼以使其作業
Dim retNumberList = {1, 2, 3, 4}
' either of these will produce a List of your Enum
Dim a = retNumberList.Select(Function(i) DirectCast(i, ACTUATORMODELS)).ToList()
Dim b = retNumberList.Select(Function(i) CType(i, ACTUATORMODELS)).ToList()
至于原來的不起作用:
Dim c = retNumberList.Cast(Of ACTUATORMODELS)().ToList()
文獻表明這相當于(type)objc# 樣式轉換,但 vb.net 轉換的兩個版本都可以在 select 中使用。我不確定為什么。
uj5u.com熱心網友回復:
djv 的回答有助于解決您的問題。希望這個答案能解釋出了什么問題。如果您查看Cast(Of T)on an untyped的參考源IEnumerable,您會發現發生的第一件事是與此等效的 C#:
Dim asTyped = TryCast(source, IEnumerable(Of TResult))
If asTyped IsNot Nothing Then Return asTyped
令人驚訝的是,這個演員陣容將適用于Integer()to IEnumerable(Of ACTUATORMODELS)。這引發了問題,因為當涉及到生成的序列時,List(Of T)事實證明它實際上是不可互換的,但已經將序列視為它們是可互換的。Integer()ACTUATORMODELS()Cast
根據一些測驗,這個問題似乎是由于這個極端情況與List(Of T)范圍建構式如何作業的極端情況以及更一般的Integer()vs 極端情況的相互作用而引起的TEnum()。
在迭代的一般情況下,Integer()它是IEnumerable(Of TEnum)有效的。您可以For Each對序列進行回圈,列舉變數將TEnum作為型別,并且您將看到這些值,就好像它們是TEnum.
問題出在 的范圍建構式中List(Of T),并在那里對實作的源進行了優化ICollection(Of T)。在這種情況下,ctor 將嘗試使用ICollection(Of T).CopyTo將專案復制到串列的內部存盤中。這是錯誤最終發生的地方,因為(回到 的實作Cast(Of T))源仍然是Integer()陣列,并且Array.Copy(通過Array.CopyTo)不適合嘗試使用TEnum().
我覺得這是某個地方的錯誤,盡管我不確定它是否在Cast(Of T)、List(Of T)范圍 ctor 或陣列復制處理中。我也不確定它是否會得到修復,因為它是一個極端情況,看起來像是重大優化,需要非常專業的檢查才能捕獲。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/426191.html
標籤:VB.net
