抛出System.InvalidCastException

时间:2011-04-20 18:05:07

标签: vb.net

我在Visual Basic中编写幻灯片,并在尝试通过For Each循环初始化数组时获得SystemInvalidCastException。

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

john.jpg  
jack.jpg  
jill.jpg

我的ImageNames是一个包含名称列表的数组(省略“.jpg”),我希望通过这种方法我可以通过简单地将其名称插入ImageNames来从网站上获取任何图像,只要有一个相应的图像。我错了吗?

所以,在我的For Each循环中,我使用一个简单的循环来使用ImageNames中的名称初始化我的Images()数组,如下所示:

    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

这给了我一个非常奇怪的错误,我不知道如何解决。我已经尝试过转换所有可能的东西,改变数据类型,使用不同的循环结构等等......自从昨晚以来我一直对此感到难过,从那时起我就非常着迷。任何帮助表示赞赏。感谢。

3 个答案:

答案 0 :(得分:0)

您的ImageNames数组包含什么?除非它是int,否则我认为你不能将它用作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

答案 1 :(得分:0)

如果要索引图像,为什么不使用Dictionary / HashTable / etc.

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:有一天,我会弄清楚如何让可爱的代码格式化实际工作......

答案 2 :(得分:0)

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

  

ImageNames(I)

在该代码中,“i”是索引。它是数组中的实际字符串。相反,你想要这个:

"http://example.com/images/" & i & ".jpg"

第二个问题在这里:

  

Dim Images()为String

这比仅仅声明一个没有字符串的数组更深入:它是一个没有位置的数组 - 一个大小为零的数组。有几种方法可以解决这个问题。在这种情况下,看起来你习惯于使用集合而不是数组(也许你使用了不同的语言,如javascript或php,错误地将集合标记为数组)。考虑到这一点,我将更改您的代码以使用集合,如下所示:

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))