接口不能被实例化,但这是一个异常吗?

13

在看到我实际上需要实例化一个接口才能在C#中使用Word互操作时,我感到非常惊讶。

Microsoft.Office.Interop.Word.Application word = new Microsoft.Office.Interop.Word.Application();
根据其XML文档所述,Microsoft.Office.Interop.Word.Application是一个接口。 enter image description here 这怎么可能呢?是Visual Studio将其与其他内容混淆了吗?还是有什么允许实例化该接口的方法?

哇,那很有趣。好问题! - mituw16
请参见https://dev59.com/H0jSa4cB1Zd3GeqPJ_nW。 - Kris Vandermotten
2个回答

14

这是因为它是一个COM接口。只有COM接口才能直接实例化, 所以运行时会在后台创建真实类型的实例。个人认为这有点不美观(我也找不到C#规范中相关的解释),但就是这样。

您实际上可以“伪造”这个过程,使得C#编译器相信您的接口是一个COM类型而不需要完全涉及COM...请参见我的相关问题获取详细信息。


3
在我看来,你是一位真正的C#大师。 - JAX

3
根据定义,你不能在C#中实例化一个接口,而Application不是一个常规的.NET interface,而是一个COM接口。 来自MSDN

这是一个.NET接口,派生自COM coclass,由托管代码要求与相应的COM对象进行交互。

现在,你可能会问自己为什么? 当C#编译器确定一个System.Runtime.InteropServices.CoClass属性正在装饰一个interface时,它会自动使用提供的typeCoClass属性上使用Activator.CreateInstance。例如:

[System.Runtime.InteropServices.CoClass(typeof(Test))] - 这将创建一个新的 Test 实例。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接