需要帮助将C#转换为vb。 “数组初始值设定项缺少1个元素”

时间:2009-05-04 15:19:39

标签: c# vb.net typeof gettype

我正在尝试使用3.5框架将以下代码从C#传送到Vb。

以下是C#中我遇到问题的代码。

MethodInfo mi = typeof(Page).GetMethod("LoadControl", new Type[2] { typeof(Type), typeof(object[]) });

我认为在VB中会是这样的;

Dim mi As MethodInfo = GetType(Page).GetMethod("LoadControl", New Type(2) {GetType(Type), GetType(Object())})

但是我收到以下错误“数组初始化程序缺少1个元素”

我遇到麻烦并遇到同样错误的另一行是

control = (Control) mi.Invoke(this.Page, new object[2] { ucType, null });

我在vb中尝试了这个但是它不起作用。

control = DirectCast(mi.Invoke(Me.Page, New Object(2) {ucType, Nothing}), Control)

ucType定义如下

Dim ucType As Type = Type.[GetType](typeName(1), True, True)

非常感谢任何帮助。

6 个答案:

答案 0 :(得分:6)

VB.Net数组是基于0的,但是使用最高索引而不是项目数来声明。因此,索引为0..9的10项数组被声明为Item(9)。

话虽如此,你的问题的真正解决方案是让编译器找出数组长度,如下所示:

Dim mi As MethodInfo = GetType(Page).GetMethod("LoadControl", New Type() {GetType(Type), GetType(Object())})

答案 1 :(得分:5)

在VB.NET中,数组声明采用数组的上限,而不是像C#那样的长度(如果你问我那么傻)。因此,您需要将传递到数组声明中的数量减少1(因为数组从零开始)。

答案 2 :(得分:3)

对于第一行,您需要将新的Type(2)更改为New Type(1)。

Dim mi As MethodInfo = GetType(Page).GetMethod("LoadControl", New Type(1) {GetType(Type), GetType(Object())})

在VB.Net中,数组初始值设定项中指定的数字是最高可访问索引与长度的关系。你提到的第二行有同样的问题和解决方案。

答案 3 :(得分:2)

VB使用上限作为数组的参数。

new byte[X]

new byte(X) 'wrong, 1 more element
new byte(X-1) 'correct, kinda confusing
new byte(0 to X-1) 'correct, less confusing

我建议使用(0到X-1)样式,因为它更清晰。在vb6天中,当数组(X)可以表示0到X或1到X时,这取决于上下文,这一点更为重要。

答案 4 :(得分:1)

就像这样 -

Dim mi As MethodInfo = GetType(Page).GetMethod("LoadControl", New Type(1) {GetType(Type), GetType(Object())})

另一个将是 -

control = DirectCast(mi.Invoke(Me.Page, New Object(1) {ucType, Nothing}), Control)

答案 5 :(得分:1)

http://converter.telerik.com有一个在线版本可供转换 C#到VB,反之亦然。