从 VB 转换为 C# 的代码中的 IndexOutOfRange 异常

本文关键字:代码 IndexOutOfRange 异常 VB 转换 | 更新日期: 2023-09-27 17:56:23

我有这个VB代码

 Public Function InitJobTicketConcaveItemsType() As JobTicketConcaveItemsType
        Dim OutData As JobTicketConcaveItemsType
        With OutData
            .NumJobItems = 1
            ReDim .JobItems(.NumJobItems - 1)
            .JobItems(0) = JobDataConcaveEnum.JDBDryData
        End With
        Return OutData
    End Function

转换后的 C# 代码

public static JobTicketConcaveItemsType InitJobTicketConcaveItemsType()
        {
            JobTicketConcaveItemsType OutData = default(JobTicketConcaveItemsType);
            var _with25 = OutData;
            _with25.NumJobItems = 1;
            // ERROR: Not supported in C#: ReDimStatement - replaced with the statement below
            Array.Resize(ref _with25.JobItems, _with25.NumJobItems - 1);
            _with25.JobItems[0] = FrontEndEnums.JobDataConcaveEnum.JDBDryData;
            return OutData;
        }

当我尝试运行应用程序时,我得到一个错误索引超出范围异常未处理。我已经确保使用 Array.Resize() 来重新分配数组

VB中的代码不会给出错误。有什么线索吗?

JDBDryData的定义如下

public enum JobDataConcaveEnum
        {
            JDBWetData = 0,
            JDBDryData,
            JDBWetCylinder,
            JDBAxis
        }

我在语句中收到错误

_with25.JobItems[0]=FrontEndEnums.JobDataConcaveEnum.JDBDryData;

从 VB 转换为 C# 的代码中的 IndexOutOfRange 异常

在 VB 数组声明中,指定最后一个有效索引:

'Declare a single-dimension array of 5 values
Dim numbers(4) As Integer 

在 C# 数组声明中,指定数组的长度。

这意味着在将 VB 数组声明转换为 C# 声明时,应始终添加 1。所以,简单地说,不要减去那 1:

Array.Resize(ref _with25.JobItems, _with25.NumJobItems);

为什么在代码的以下行中将_with25.JobItems数组的大小调整为0大小。

Array.Resize(ref _with25.JobItems, _with25.NumJobItems - 1);

然后发生的情况是您的数组大小变为零。说到线

_with25.JobItems[0] = FrontEndEnums.JobDataConcaveEnum.JDBDryData;

你得到ArrayIndexOutOfBound异常,你可以看到,你正在尝试将一个值设置为一个根本没有元素的数组的第零个元素(大小为零的数组)

删除Array.Resize(ref _with25.JobItems, _with25.NumJobItems - 1); 或编辑同一行,如下所示 Array.Resize(ref _with25.JobItems, _with25.NumJobItems);瞧。

问题是您无法将数组大小调整为大小 0,正如其他答案已经提到的那样。另外,您需要知道 VBscript 中声明的数组大小比 C# 多 1。因此,请确保提供适当的大小。因此,在您的情况下,如果不调整数字,就无法公然将_with25.NumJobItems - 1从 VBScript 转换为 C#。

关于 VBScript 和 C# 中的数组大小:

  • VB脚本:

    点心(5)

    ' 大小为 6,您可以通过 arr(0)、arr(1)、...到达(5)

  • C#

    MyType[] arr = new MyType[5];

    大小为 5,您可以通过 arr[0]、arr[1]、...到达[4]

您根本不需要使用Array.Resize,只需将现有数组中的内容复制到新数组中,并使用Array.CopyTo将其存储到原始数组中:

var tmp = with25.JobItems;
with25.JobItems = new MyType[_with25.NumJobItems]; 
tmp.CopyTo(with25.JobItems, 0);

大多数答案都混淆了"ReDim"和"ReDim Preserve"。对于简单的"ReDim"的转换,不需要甚至不建议调用 Array.Resize - C# 等效项只是:

public JobTicketConcaveItemsType InitJobTicketConcaveItemsType()
{
    JobTicketConcaveItemsType OutData = new JobTicketConcaveItemsType();
    OutData.NumJobItems = 1;
    OutData.JobItems = new foo[OutData.NumJobItems];
    OutData.JobItems[0] = JobDataConcaveEnum.JDBDryData;
    return OutData;
}