Vb.net 抛出System.InvalidCastException

Vb.net 抛出System.InvalidCastException,vb.net,Vb.net,我正在用VisualBasic编程一个幻灯片,当试图通过For-Each循环初始化数组时,会得到一个SystemInvalidCastException 这就是我要做的。我有一个Images()数组和另一个ImageNames()数组。现在我将所有图像存储在一个网站上,比如example.com/images,为了便于使用,我将所有图像命名为: john.jpg jack.jpg jill.jpg 这给了我一个非常奇怪的错误,我不知道如何修复。我尝试过转换所有可能的东西,更改数据类型,使

我正在用VisualBasic编程一个幻灯片,当试图通过For-Each循环初始化数组时,会得到一个SystemInvalidCastException

这就是我要做的。我有一个Images()数组和另一个ImageNames()数组。现在我将所有图像存储在一个网站上,比如example.com/images,为了便于使用,我将所有图像命名为:

john.jpg jack.jpg jill.jpg
这给了我一个非常奇怪的错误,我不知道如何修复。我尝试过转换所有可能的东西,更改数据类型,使用不同的循环结构,等等。。。从昨晚起我就一直被这件事难住了,从那以后我就一直被它困扰着。感谢您的帮助。谢谢。

您的图像名称数组包含哪些内容?除非它是int's,否则我认为您无法将其用作Images()数组的索引器

编辑,抱歉,只是完全掩盖了您谈论ImageNames()的部分。假设Images()是一个简单的数组,您将无法以这种方式引用数组中的项。ImageNames.Length==Images.Length吗

我对VB语法非常生疏,因此这可能无法按原样编译,但您可以这样做,而不是使用ForEach:

Dim ImageNames() as String = {"john", "jack", "jill"}
Dim Images() as String= new String(ImageNames.Length){}

For i as Integer = 1 to Images.Length
    Images(i) = "http://example.com/images/" & ImageNames(i) & ".jpg"
Next

如果你想索引你的图像,为什么不使用字典/哈希表/等等

Dim images As Dictionary(of Long, Object)  ' Change object to whatever type your image is
images = New Dictionary(Of Long, Object) ' Be sure to initialise the collection
images.Add(1, myImage1) 'Add an image
images.Add(2, myImage2) 'Add another image

Dim ret As Object  'If you now want to fetch an image from the dictionary...
If images.ContainsKey(1) Then ret = images(1)
编辑:

当前代码的问题在于,您依赖于Images()和ImageNames()数组彼此保持同步。如果您有很多选择可以让这些信息正确地链接在一起(而不是Array1(i)应该与Array2(i)相关),那么这很可能是个坏主意

在重读了你的文章,并坚持我的字典的想法上面,看到以下

Public Sub DictionaryAnswer()

    ' This is your current ImageNames array in list form
    Dim imageNames As List(Of String) = New List(Of String) From {"Jack", "Jill", "John"}

    ' To show both implementations, here it is in array form again
    Dim imageNamesArray() As String = imageNames.ToArray

    ' IWe create a format for your base address - {0} will be replaced by the image name
    Dim baseAddressFormat As String = "http://example.com/images/{0}.jpg"

    ' This is how you would add a list of names to a dictionary
    Dim imagesFromList As Dictionary(Of String, String) = New Dictionary(Of String, String)
    imageNames.ForEach(Sub(n) imagesFromList.Add(n, String.Format(baseAddressFormat, n)))

    ' And similarly for your array
    Dim imagesFromArray As Dictionary(Of String, String) = New Dictionary(Of String, String)
    imageNamesArray.ToList.ForEach(Sub(n) imagesFromArray.Add(n, String.Format(baseAddressFormat, n)))

    ' You can now get the url's for your images by name by doing something like:
    Dim jillsImage As String
    If imagesFromList.ContainsKey("Jill") Then jillsImage = imagesFromList("Jill")
    Dim jacksImage As String
    If imagesFromArray.ContainsKey("Jack") Then jacksImage = imagesFromArray("Jack")

End Sub
希望这能澄清我的意思


编辑#15:总有一天我会想出如何让可爱的代码格式真正起作用…

您的代码有两个问题。第一点是:

图像名称(一)

在该代码中,“i”不是索引。它是数组中的实际字符串。相反,您希望这样:

"http://example.com/images/" & i & ".jpg"
第二个问题是:

Dim Images()作为字符串

这不仅仅是声明一个没有字符串的数组:它是一个没有字符串位置的数组——一个大小为零的数组。有几种方法可以解决这个问题。在本例中,您似乎习惯于使用集合而不是数组(可能您使用了另一种语言,如javascript或php,将集合错误地标记为数组)。考虑到这一点,我将更改您的代码以使用集合,如下所示:

    Dim Images() as String
    Dim ImageNames() as String = {"john", "jack", "jill"}

    Dim i as String

    For Each i In ImageNames
        Images(i) = "http://example.com/images/" & ImageNames(i) & ".jpg"
    Next
Dim Images as New List(Of String)()
Dim ImageNames() as String = {"john", "jack", "jill"}

For Each i As String In ImageNames
    Images.Add("http://example.com/images/" & i & ".jpg")
Next
Dim ImageNames() as String = {"john", "jack", "jill"}
ImageNames.Select(Function(s) String.Format("http://example.com/images/{0}.jpg", s))
但这只是对现有代码的重写。如果我要重新开始,我会这样写:

    Dim Images() as String
    Dim ImageNames() as String = {"john", "jack", "jill"}

    Dim i as String

    For Each i In ImageNames
        Images(i) = "http://example.com/images/" & ImageNames(i) & ".jpg"
    Next
Dim Images as New List(Of String)()
Dim ImageNames() as String = {"john", "jack", "jill"}

For Each i As String In ImageNames
    Images.Add("http://example.com/images/" & i & ".jpg")
Next
Dim ImageNames() as String = {"john", "jack", "jill"}
ImageNames.Select(Function(s) String.Format("http://example.com/images/{0}.jpg", s))

它包含我想要获取的所有图像的实际名称(不包括扩展名)。好吧,我在这里迷路了。这到底是为什么?这个错误没有给我任何信息。除了我想做的事情,还有其他选择吗?Images()是一个空数组。我尝试在表单加载中使用For-Each循环初始化它。有不同的方法吗?在您展示的代码片段中,您试图使用图像的名称访问图像数组中的元素,试图找出您想要的元素,但这行不通,因为VB无法翻译“john”、“jack”等。。。输入有效数字。这很可能是cast失败的地方。是的,请给我一分钟时间写一些简单的东西。这似乎和在image()数组中列出每个图像的链接一样低效。谢谢你的帮助,但是我更愿意用一个循环。