Двойные скобки в синтаксисе массива VB6 (передаются из .Net com-interop) - PullRequest
2 голосов
/ 30 декабря 2011

У меня есть C # dll, выставленная vb6 через com-interop.Это все работает, но я замечаю нечто странное, когда я передаю массив пользовательских объектов из .Net в VB6.

Доступ к массиву из VB6 - это то, что сбивает меня с толку.Если я обращаюсь к массиву напрямую , я должен сделать это так:

Dim manager as New ObjectManager

'Access with two sets of parentheses:
msgbox manager.ReturnArrayOfObjects()(0).Name

Однако, если я сначала скопирую массив, я могу получить к нему доступ, как обычно ожидаю:

Dim manager as New ObjectManager
Dim objectArray() As CustomObject

'copy the array
objectArray = manager.ReturnArrayOfObjects

'access normally:
msgbox objectArray(0).Name  

В первом случае мне пришлось использовать два набора скобок: manager.ReturnArrayOfObjects()(0).Name Во втором случае я мог просто использовать один набор скобок: objectArray(0).Name

Кто-нибудь знает, почему это так?Возможно, я что-то не так делаю с взаимодействием?

Вот небольшая заглушка / пример кода взаимодействия C #.

[ComVisible(true)]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
[Guid("[Guid here...]")]
public interface IObjectManager
{
    [DispId(1)]
    CustomObject[] ReturnArrayOfObjects();
}

[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
[Guid("[guid here...]")]
public class ObjectManager: IObjectManager
{
    public CustomObject[] ReturnArrayOfObjects()
    {
        return new CustomObject[] { new CustomObject(), new CustomObject() };
    }
}

Класс CustomObject() также подвергаетсявзаимодействовать и работать просто отлично.Пожалуйста, дайте мне знать, если вам нужно, чтобы я разместил больше кода, но я думаю, что эти маленькие фрагменты достаточно хорошо представляют проблему для начала.

Заранее спасибо за вашу помощь.

Ответы [ 2 ]

8 голосов
/ 30 декабря 2011

ReturnArrayOfObjects() в коде C # является методом. Ваш код VB6 вызывает метод, который возвращает массив, а затем обращается к первому элементу. Разница между этим

msgbox manager.ReturnArrayOfObjects()(0).Name 

и это

objectArray = manager.ReturnArrayOfObjects    
msgbox objectArray(0).Name 

Это то, что во втором вы вызываете метод сам по себе, не обращаясь к первому элементу, а VB позволяет вам исключить скобки из вызова метода. И наоборот, язык не позволяет вам оставлять скобки при непосредственном доступе к первому элементу. Это просто языковая функция, это не проблема «синтаксиса массива в двойных скобках».

3 голосов
/ 30 декабря 2011

ReturnArrayOfObjects - это метод, который должен быть вызван.В VB6, если вы вызываете метод и задаете параметры no , а это весь оператор, вы можете опустить круглые скобки.

Однако в первом примере вывызов метода, а затем индексация в массиве, возвращаемом этим методом.Вам понадобится набор first круглых скобок, чтобы указать, что вы не передаете в метод никаких параметров, а затем второй набор скобок используется для индексации массива.

...