繁体   English   中英

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

[英]Double parentheses in VB6 Array syntax (passed from .Net 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

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

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#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() };
    }
}

CustomObject()类也暴露给com-interop并且正常工作。 如果您需要我发布更多代码,请告诉我,但我认为这些小片段代表了这个问题。

在此先感谢您的帮助。

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

msgbox manager.ReturnArrayOfObjects()(0).Name 

和这个

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

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

ReturnArrayOfObjects是一个必须被调用的方法。 在VB6,如果你调用一个方法并提供任何参数,它是整个语句,那么你可以省略括号。

但是,在第一个示例中,您将调用该方法,然后索引到该方法返回的数组。 您需要第一组括号表示您没有向方法传递任何参数,然后第二组括号用于数组索引。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM