Microsoft.Office.Interop.Word._Document接口(interface)具有带有以下签名的方法:

void Close(ref object SaveChanges = Type.Missing, ref object OriginalFormat = Type.Missing, ref object RouteDocument = Type.Missing);

我在理解上有几点困难:
  • ref参数不能具有默认值。
  • 默认值必须是一个常数,而Type.Missing不是。
  • 调用此方法时,可以使用Close(false)-通常ref参数需要可分配的变量吗?
  • 在Visual Studio中导航到Type的定义时,它将带我到_Document.Type属性,但是它没有名为Missing的属性。这是VS中的错误吗?

  • 谢谢您的解释。

    最佳答案

    这是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
        }
    }
    

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

    当然,这不是很漂亮,Type.Missing是普通C#代码中对象的一个​​相当奇怪的默认值。每个人都会期望null。但是,这非常实用,用C#编写低于4的版本的Office互操作代码是一项相当糟糕的练习。当公司这样做时,公司可能会遇到麻烦,如果Neelie Kroes忍不住了,她将要求微软为此支付10亿欧元的罚款:)

    关于c# - 了解COM C#接口(interface),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24693070/

    10-12 00:01
    查看更多