我正在定义一系列可COM调用的接口,我可以用它来从VBA访问.NET程序集,这个设置类似于我过去多次做过的。对于这组类,如果托管代码在方法上使用可选的可为空参数,我在接口上定义了一个使用变量的方法。此代码似乎正常运行,因为从VBA调用时,我可以将任一参数作为空值或填充值传递,并且.NET正确接收可选参数,作为null或作为我可以尝试强制转换和使用的对象。奇怪的是,在读取我使用REGASM创建的类型库的IDL时,我看到:
HRESULT SetCommentData(
[in, optional, defaultvalue(<unprintable IUnknown*>)] VARIANT sequencenumber,
[in, optional, defaultvalue("")] BSTR Message);
.NET中的方法定义是:
VB.NET:
'managed definition in class
Public Sub SetCommentData(Optional sequencenumber As Decimal? = Nothing, _
Optional message As String = Nothing)
'managed definition in class for COM
Public Sub SetCommentData(Optional sequencenumber As Object = Nothing, _
Optional message As String = Nothing) Implements _
_RoutingComment.SetCommentData
'managed definition in interface
Sub SetCommentData(Optional sequencenumber As Object = Nothing, _
Optional message As String = Nothing)
或者如果你喜欢C#:
//managed definition in class
public void SetCommentData(decimal? sequencenumber = null, string message = null)
//managed definition in class for COM
public void SetCommentData(object sequencenumber = null, string message = null)
//managed definition in interface
void SetCommentData(object sequencenumber = null, string message = null)
我的猜测是COM不知道.NET null对象是什么,这就是为什么它默认为IUnknown。将字符串默认设置为&#34;&#34;有点有趣(特别是因为我说null!),但我想这一定是REGASM中的一个特例。我认为调用者对默认值有什么影响并不重要,因此它更多地作为程序员的Intellisense信息而不是binder /编译器提供。既然它正在工作,也许我不应该担心这个IDL,但我想知道是否有一个COMAttribute或我可以申请澄清默认值为null的东西。 VBA对象查看器似乎没有注意默认值,显示:
Sub SetCommentData([sequencenumber], [Message As String])
简而言之,这是一个可以忽略不计的互操作工件,仅仅是信息性的,或者在某些情况下,这可能对程序产生有意义的影响吗?不知道在这种情况下什么是无法打印的意思,所以任何知道这一点的人都可以对此提出异议。