从 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 数组声明中,指定最后一个有效索引:
'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;
}