VB6数组语法中的双括号(从.Net com-interop传递)

Joe*_*ung 2 c# arrays vb6 com-interop

我有一个C#dll通过com-interop暴露给vb6.这一切都有效,但是当我将.Net的自定义对象数组传递给VB6时,我注意到了一些奇怪的事情.

从VB6访问数组让我感到困惑.如果我直接访问数组,我必须这样做:

Dim manager as New ObjectManager

'Access with two sets of parentheses:
msgbox manager.ReturnArrayOfObjects()(0).Name
Run Code Online (Sandbox Code Playgroud)

但是,如果我先复制数组,我可以访问它通常所期望的:

Dim manager as New ObjectManager
Dim objectArray() As CustomObject

'copy the array
objectArray = manager.ReturnArrayOfObjects

'access normally:
msgbox objectArray(0).Name  
Run Code Online (Sandbox Code Playgroud)

在第一种情况下,我不得不用2套括号:manager.ReturnArrayOfObjects()(0).Name 在第二种情况下,我可以只使用一个括号中:objectArray(0).Name

有谁知道为什么会这样?我可能在这里做错了吗?

这是C#interop代码的快速存根/示例.

[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() };
    }
}
Run Code Online (Sandbox Code Playgroud)

该课程CustomObject()也接触到com-interop并且工作得很好.如果您需要我发布更多代码,请告诉我,但我认为这些小片段代表了这个问题.

在此先感谢您的帮助.

Ant*_*ram 8

ReturnArrayOfObjects()在C#代码中是一种方法.您的VB6代码正在调用该方法,该方法返回数组,然后访问第一个元素.这个区别

msgbox manager.ReturnArrayOfObjects()(0).Name 
Run Code Online (Sandbox Code Playgroud)

还有这个

objectArray = manager.ReturnArrayOfObjects    
msgbox objectArray(0).Name 
Run Code Online (Sandbox Code Playgroud)

在第二个中,您在不访问第一个元素的情况下自己调用方法,VB允许您从方法调用中省略括号.相反,当您直接访问第一个元素时,该语言不允许您放弃括号.它只是一种语言功能,它不是"双括号数组语法"问题.