繁体   English   中英

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

[英]IndexOutOfRange Exception in code converted from VB to C#

我有这个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;
        }

当我尝试运行应用程序时,出现未处理的Error IndexOutOfRangeException错误。 我确保使用Array.Resize()重新分配数组

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

JDBDryData的定义如下

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

我在声明中得到了错误

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

为什么在代码的下一行中将_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);编辑同一行: Array.Resize(ref _with25.JobItems, _with25.NumJobItems); 看看。

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

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

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

  • VB脚本:

    昏暗的人(5)

    '大小为6,您可以通过arr(0),arr(1),... arr(5)访问它们

  • C#

    MyType [] arr = new MyType [5];

    //大小为5,您可以通过arr [0],arr [1],... arr [4]访问它们

您根本不需要使用Array.Resize ,只需将内容从现有数组复制到一个新数组中,然后使用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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM