【发布时间】:2016-08-28 08:09:07
【问题描述】:
System.Collections.ArrayList 是 ComVisible(true)。它包含IndexOf 的三个重载(参见here):
public virtual int IndexOf(Object value)
public virtual int IndexOf(Object value, int startIndex)
public virtual int IndexOf(Object value, int startIndex, int count)
从 VBScript 中,只能访问第二个重载:
Dim oList
Set oList = CreateObject("System.Collections.ArrayList")
'oList.IndexOf "foo" 'Error: Invalid procedure call or argument: 'IndexOf'
oList.IndexOf "foo", 0
'oList.IndexOf "foo", 0, 1 'Error: Wrong number of arguments or property assignment was not valid: 'IndexOf'
在'Overloading a method in com visible dll'Hans Passant 解释说 程序集中存在重载方法,但无法从脚本中获取它们 dispid,因此打电话给他们。这似乎意味着一种方法可能会成功。
- 我能否从 ArrayList 源(或其他地方)确定可以访问哪个方法?管理这个选择过程的规则是什么?
- 为什么情况一和三的错误消息不同?
【问题讨论】:
-
如here(MSDN) 所述,当重载方法暴露给 COM 客户端时,只有第一个重载方法保留其名称。我不知道为什么不是这样,除非您链接中提供的代码不准确...
-
就像@Pikoh 说的只有第一个重载保留了名称(Hans 也指出了这一点——“类型库导出器通过重命名重载方法来解决这个问题,它将是
Write_2()。 ") 你为什么不试试oList.IndexOf_2 "foo", 0和oList.IndexOf_3 "foo", 0, 1? -
其实所有的方法都是暴露的。例如,您可以使用 :
oList.IndexOf_3 "foo"访问一个参数覆盖,或者使用oList.IndexOf_2 "foo", 0, 1访问 3 个参数 -
@Lankymart 谢谢,我正在考虑。事实证明,我的问题是一个糟糕的问题,因为它基于一个错误的假设。尽管如此,答案还是很有帮助的,而且总的来说似乎很有用。由于这是更新您的闲聊评论,因此我将在 24 小时内将其删除,以便为其他观众清理 cmets。感谢您的支持。
标签: c# vbscript overloading