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

时间:2016-07-12 06:12:23

标签: c# vb.net winforms

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

当我尝试运行应用程序时,我得到一个错误IndexOutOfRangeException未处理。我确保使用 Array.Resize()来重新分配数组

VB中的代码不会出错。有线索吗?

JDBDryData定义如下

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

我在声明中得到错误

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

5 个答案:

答案 0 :(得分:1)

为什么要在代码的以下行中将_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);并查看。

答案 1 :(得分:1)

VB array declarations中,指定最后一个有效索引:

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

C# array declarations中,指定数组的长度。

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

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

答案 2 :(得分:1)

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

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

  • VB脚本:

    Dim arr(5)

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

  • 访问它们
  • C#

    MyType [] arr = new MyType [5];

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

  • 访问它们

答案 3 :(得分:0)

您根本不需要使用def visitdir(path): result = [] for root,dirs,files in os.walk(path): for filepath in files: result.append(''.join(os.path.join(root,filepath))) return result if __name__ == '__main__': path = raw_input("Please input the folder you want to walk:") visitdir(path) ,只需将现有数组中的内容复制到新数组中,然后使用Array.Resize将其存储到原始数组中:

Array.CopyTo

答案 4 :(得分: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;
}