理解COM c#接口

wez*_*ten 6 c# com com-interop

Microsoft.Office.Interop.Word._Document接口有一个带有以下签名的方法:

void Close(ref object SaveChanges = Type.Missing, ref object OriginalFormat = Type.Missing, ref object RouteDocument = Type.Missing);
Run Code Online (Sandbox Code Playgroud)

有几点我无法理解:

  1. ref参数不能具有默认值.
  2. 默认值必须是常量,而Type.Missing不是.
  3. 调用这个方法时,我可以使用Close(false)- 通常一个ref参数需要一个可赋值的变量?
  4. 导航到TypeVisual Studio中的定义时,它会将我带到_Document.Type属性,但是它没有名为的属性Missing.这是VS中的一个错误吗?

谢谢你的任何解释.

Han*_*ant 3

这是一个怪癖,在 C# 版本 4 中引入。它不是 COM 互操作代码所独有的,您也可以在自己的代码中获得它。尝试这个:

using System;
using System.Runtime.InteropServices;

class Program {
    static void Example([Optional] object arg) { }
    static void Main(string[] args) {
        Example(   // <== Look at the IntelliSense popup here
    }
}
Run Code Online (Sandbox Code Playgroud)

触发此行为的是 [Optional] 属性。一直存在,但以前在 C# 中从未特别有用。与 VB.NET 和 C++/CLI 等其他语言不同。从 C# v4 开始,它以不同的方式解释属性,并且编译器会将 Type.Missing 硬编码为 object 参数类型的可选。尝试将参数类型更改为字符串,并注意默认值会有所不同。空,如您所料。

当然,这不太漂亮,Type.Missing 对于普通 C# 代码中的对象来说是一个相当奇怪的默认值。每个人都会期望null。然而它非常实用,在 4 之前的版本中用 C# 编写 Office 互操作代码是一项相当可怕的工作。顺便说一句,当公司做这样的事情时可能会遇到麻烦,如果 Neelie Kroes 听到风声,她会让微软为此支付 10 亿欧元的罚款:)