【问题标题】:Error when trying to get index of an Array尝试获取数组索引时出错
【发布时间】:2014-07-29 14:09:03
【问题描述】:

我有一个用户输入字符串的程序。此字符串长度始终是 8 的倍数。

所以为了转换字符串,我将字符串每隔 8 个字符拆分为一个数组。

我用这段代码做到这一点

Dim substrings = Enumerable.Range(0, input.Length \ 8).[Select](Function(i) input.Substring(i * 8, 8))

效果很好。

然后我可以输入String.Join(" ", substrings),它会正常工作,它接受用户输入的任何内容,并在每 8 个字符之间放置一个空格。

但是,如果我尝试这样做:

Dim indexOfEntry
For Each e In substrings
    indexOfEntry = Array.IndexOf(substrings, e)
Next

我收到一个错误:

An unhandled exception of type 'System.InvalidCastException' occurred in DataCalculator.exe

Additional information: Unable to cast object of type 'WhereSelectEnumerableIterator`2[System.Int32,System.String]' to type 'System.Array'.

我该如何解决这个问题?

【问题讨论】:

  • 代替 For Each,你能不能只做 For indexOfEntry As Integer = 0 To substrings.Length-1 ?

标签: .net arrays vb.net indexing


【解决方案1】:

更改分割线返回字符串数组

 Dim substrings = Enumerable.Range(0, input.Length \ 8).[Select](Function(i) _ 
                                   input.Substring(i * 8, 8)).ToArray()

我真的建议您在 VB.NET 配置中打开 OPTION STRICT 标志。
这允许编译器检查您的代码是否存在这样的潜在陷阱。

像在 VB6 时代那样的值的自动转换不应该在 NET 世界中占有一席之地(但这是一种观点,我认为如果将该标志设置为 OFF,旧程序的移植会更容易。)

【讨论】:

  • 打开选项严格给我的程序 102 个新错误。如果我想解决这些问题,我还有很多工作要做。
  • 是的,那将是至少 102 个新错误...哈哈。在这种情况下,我建议通过在每个模块/类/文件的顶部使用该行来转换 Option Strict On。然后,您可以一次浏览它们。
  • 是的,这是一个悲伤的故事。但是,请遵循 @Grim 的建议并逐个修复您的代码。会更好
【解决方案2】:

您的 substrings 变量不是数组;这是一个 IEnumerable(Of String)。您可以使用 substrings.ToArray() 将其转换为数组。

转动Option Strict On 将在编译时捕获此类错误。在这种情况下,您会在 Array.IndexOf 调用中看到“重载解析失败...”,这表明该变量不是数组变量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-14
    • 2017-12-23
    • 1970-01-01
    • 2020-07-25
    • 1970-01-01
    • 2019-10-16
    相关资源
    最近更新 更多