在C#中创建接口实例

我正在使用C#中的MS Excel互操作,我不明白这个特定的代码行是如何工作的:

var excel = new Microsoft.Office.Interop.Excel.Application(); 

其中Microsoft.Office.Interop.Excel.Application是INTERFACE,定义如下:

 [Guid("000208D5-0000-0000-C000-000000000046")] [CoClass(typeof(ApplicationClass))] public interface Application : _Application, AppEvents_Event { } 

我认为当界面用CoClass属性修饰时会发生一些魔法,但是我们怎么可能用新关键字创建一个接口实例呢? 它不应该生成编译时错误吗?

实际上,您提到的代码创建了ApplicationClass类的实例,这就是CoClass属性的作用。

有关详细信息,请参阅此答案: C#编译器如何检测COM类型?

艾恩德在博客中写到这一点。

ApplicationClass是实现Application接口。 用两个词来说,接口是类方法的声明。 你的代码行创建了类ApplicationClass的实例(因为接口具有带有构造函数的类的属性),查询接口Application的这个实例并将其放到变量excel中。

关于第二个问题:不,你不能用’new’关键字创建界面。 因为,任何接口都只有声明方法,而不是实现。 您可以尝试使用它来创建自己的类和接口:

 interface MyIntf { void method1(string s1); } public class MyIntfImplementation : MyIntf { void method1(string s1) { // do it something } } 

在此之后你可以使用这个:

 MyIntf q = new MyIntfImplementation(); q.method1();