【问题标题】:Double parentheses in VB6 Array syntax (passed from .Net com-interop)VB6 数组语法中的双括号(从 .Net com-interop 传递)
【发布时间】:2012-01-30 15:21:10
【问题描述】:

我有一个通过 com-interop 暴露给 vb6 的 C# dll。这一切正常,但是当我将一组自定义对象从 .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  

在第一种情况下,我必须使用 two 组括号:manager.ReturnArrayOfObjects()(0).Name 在第二种情况下,我可以只使用 one 组括号: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() 类也暴露于 com-interop 并且工作得很好。如果您需要我发布更多代码,请告诉我,但我认为这些小 sn-ps 足以很好地代表问题。

提前感谢您的帮助。

【问题讨论】:

    标签: c# arrays vb6 com-interop


    【解决方案1】:

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

    msgbox manager.ReturnArrayOfObjects()(0).Name 
    

    还有这个

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

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

    【讨论】:

    • 谢谢。既然你解释了,这似乎相当明显,但你不会相信我昨天为此绞尽脑汁了多久。我非常感谢您的帮助。
    【解决方案2】:

    ReturnArrayOfObjects 是一个必须调用的方法。在 VB6 中,如果您正在调用一个方法并提供 no 参数,并且它是整个语句,那么您可以省略括号。

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

    【讨论】:

    • 谢谢。你也完全正确。我很感激。将@Anthony Pegram 标记为正确答案,因为他似乎更早提交了。
    猜你喜欢
    • 2011-07-13
    • 2011-01-02
    • 2018-03-04
    • 2011-11-23
    • 1970-01-01
    • 2012-08-21
    • 2023-04-11
    • 1970-01-01
    • 2015-11-22
    相关资源
    最近更新 更多