C# VB到C转换代码中的IndexOutfrange异常#

C# VB到C转换代码中的IndexOutfrange异常#,c#,vb.net,winforms,C#,Vb.net,Winforms,我有这个VB代码 Public Function InitJobTicketConcaveItemsType() As JobTicketConcaveItemsType Dim OutData As JobTicketConcaveItemsType With OutData .NumJobItems = 1 ReDim .JobItems(.NumJobItems - 1) .JobIt

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

为什么在代码的下一行中使用25.JobItems数组将
\调整为大小
0

Array.Resize(引用25.JobItems,引用25.NumJobItems-1)

然后,您的数组大小变为零。 说到线

\u with 25.JobItems[0]=FrontEndEnums.JobDataConcaveEnum.JDBDryData

当您得到
ArrayIndexOutOfBound
异常时,您可以看到,您试图将值设置为数组中没有任何元素的第零个元素(大小为零的数组)

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

Array.Resize(引用25.JobItems,引用25.numboItems)并请参见。

为什么要使用25.JobItems将
\u调整为代码下一行中
0
的大小

Array.Resize(引用25.JobItems,引用25.NumJobItems-1)

然后,您的数组大小变为零。 说到线

\u with 25.JobItems[0]=FrontEndEnums.JobDataConcaveEnum.JDBDryData

当您得到
ArrayIndexOutOfBound
异常时,您可以看到,您试图将值设置为数组中没有任何元素的第零个元素(大小为零的数组)

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

Array.Resize(引用25.JobItems,引用25.numboItems)并查看。

您根本不需要使用
数组。调整大小
,只需将现有数组中的内容复制到新数组中,然后使用
数组将其存储到原始数组中。CopyTo

var tmp = with25.JobItems;

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

您不需要使用
数组。调整大小
,只需将现有数组中的内容复制到新数组中,然后使用
数组将其存储到原始数组中。CopyTo

var tmp = with25.JobItems;

with25.JobItems = new MyType[_with25.NumJobItems]; 
tmp.CopyTo(with25.JobItems, 0);
在中,指定最后一个有效索引:

'Declare a single-dimension array of 5 values
Dim numbers(4) As Integer 
在中,指定数组的长度

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

Array.Resize(ref _with25.JobItems, _with25.NumJobItems);
在中,指定最后一个有效索引:

'Declare a single-dimension array of 5 values
Dim numbers(4) As Integer 
在中,指定数组的长度

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

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

问题是您无法将数组大小调整为0,其他答案已经提到过。 另外,您需要知道VBscript中声明的数组大小比C#大1。因此,请确保提供合适的尺寸。因此,在您的情况下,如果不调整数字,就不能公然将带有25.numObjItems-1的
\u从VBScript转换为C

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

  • VB脚本:

    仪表板(5)

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

  • C#

    MyType[]arr=新的MyType[5]

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


问题在于无法将数组大小调整为0,其他答案已经提到。 另外,您需要知道VBscript中声明的数组大小比C#大1。因此,请确保提供合适的尺寸。因此,在您的情况下,如果不调整数字,就不能公然将带有25.numObjItems-1的
\u从VBScript转换为C

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

  • VB脚本:

    仪表板(5)

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

  • C#

    MyType[]arr=新的MyType[5]

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


大多数答案都混淆了“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;
}

大多数答案将“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;
}

可能重复的No its not。。我已经使用了Array.Resize()。即使这样做了,我也会出错,是不是25.numObjItems-1的
\u不为零?这不是开始索引,这是数组的长度。这是我的想法。大小为0如果大小为0,则无法访问索引0(元素1)处的元素可能与否重复。。我已经使用了Array.Resize()。即使这样做了,我也会出错,是不是25.numObjItems-1的
\u不为零?这不是开始索引,这是数组的长度。这是我的想法。大小为0如果大小为零,则无法访问索引0处的元素(元素1)。NullReferenceException未处理。对象引用未设置为的实例object@Apoorv选中数组。调整大小(引用25.JobItems,引用25.NumJobItems)NullReferenceException未处理。对象引用未设置为的实例object@Apoorv选中数组。调整大小(引用25.JobItems,引用25.NumJobItems)否,只是为了避免为与同一对象交互的多个语句指定同一变量(或变量+链或属性访问器)的简写。这里没有“事务性的”。不,只是为了避免为与同一对象交互的多个语句指定相同的变量(或变量+链或属性访问器)而使用的缩写。这里没有“事务性”的东西。