我有一个字符串队列:
Public Class QueueClient
Private gaoFiles As New Queue(Of String)
并在一个属性中调用一个函数,意图将一个字符串数组连接到字符串队列:
Public Property AddFiles As String()
...
Set(asValue As String())
AddFilesToQueue(asValue)
End Set
End Property
这是被调用的函数,我尝试在其中执行连接。
Private Sub AddFilesToQueue(asFiles() As String)
gaoFiles = CType(gaoFiles.Concat(asFiles), Queue(Of String))
End Sub
End Class
这会让我InvalidCastException
(我有Option Strict On
)。
我理解,
gaoAudioFiles.Concat(asFiles)
尝试从字符串数组到Queue(Of String)
的隐式转换,由于我的设置,这不会完成。
如何正确投射?
给了我
答案 0 :(得分:2)
这根本不起作用。
Concat()
类型上的Queue(Of T)
方法继承自IEnumerable(OF T)
,并且正在使用该实现,这意味着您获得的所有内容都是IEnumerable(Of T)
。如果您可以将IEnumerable(Of T)
强制转换为Queue(Of T)
,但是该投射不存在,那么这将是可以的(尽管效率不高)。相反,您必须将每个项目排队:
Private Sub AddFilesToQueue(asFiles() As String)
For Each file As String in asFiles
gaoFiles.Enqueue(file)
Next file
End Sub
以这种方式使用Property也有点奇怪。当您使用赋值语义时,最终用户希望变量完全替换为新值。通过赋值语义追加是不正常的。更好地解决方法...但你可以使这个方法更有用:
Public Sub AddFilesToQueue(asFiles As IEnumerable(Of String))
For Each file As String in asFiles
gaoFiles.Enqueue(file)
Next file
End Sub
您仍然可以将数组直接传递给该方法。您还可以传递List(Of String)或从IEnumerable继承的任何其他序列(并且有很多)。