C# VB到C转换代码中的IndexOutfrange异常#
我有这个VB代码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
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)代码>否,只是为了避免为与同一对象交互的多个语句指定同一变量(或变量+链或属性访问器)的简写。这里没有“事务性的”。不,只是为了避免为与同一对象交互的多个语句指定相同的变量(或变量+链或属性访问器)而使用的缩写。这里没有“事务性”的东西。