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)
有几点我无法理解:
Type.Missing不是.Close(false)- 通常一个ref参数需要一个可赋值的变量?TypeVisual Studio中的定义时,它会将我带到_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
}
}
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 亿欧元的罚款:)
| 归档时间: |
|
| 查看次数: |
134 次 |
| 最近记录: |