Нужна помощь в преобразовании C # в VB. "в инициализаторе массива отсутствуют 1 элемент" - PullRequest
1 голос
/ 04 мая 2009

Я пытаюсь преобразовать следующий код из C # в Vb, используя 3.5 framework.

Вот код на 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 ]

6 голосов
/ 04 мая 2009

Массивы VB.Net основаны на 0, но объявляются с использованием наивысшего индекса, а не количества элементов. Таким образом, массив из 10 элементов с индексом 0..9 объявлен как Item (9).

С учетом вышесказанного реальное решение вашей проблемы состоит в том, чтобы позволить компилятору определить длину массива следующим образом:

Dim mi As MethodInfo = GetType(Page).GetMethod("LoadControl", New Type() {GetType(Type), GetType(Object())})
5 голосов
/ 04 мая 2009

В VB.NET объявление массива принимает верхнюю границу массива, а не длину, как в C # (глупо, если вы спросите меня). Из-за этого вам нужно уменьшить число, передаваемое в объявления массива, на 1 (поскольку массивы начинаются с нуля).

3 голосов
/ 04 мая 2009

Для первой строки вам нужно изменить новый тип (2) на новый тип (1).

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

В VB.Net число, указанное в инициализаторе массива, является наибольшим доступным индексом по сравнению с длиной. Во второй строке, которую вы упомянули, та же проблема и решение.

2 голосов
/ 04 мая 2009

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 в зависимости от контекста.

1 голос
/ 04 мая 2009

Доступна онлайн-версия на http://converter.telerik.com, которая преобразует C # для VB и наоборот.

1 голос
/ 04 мая 2009

Будет так -

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)
...