[英]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);
看看。
问题是您无法将数组的大小调整为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.