为什么接口变量实例化可能?

时间:2015-06-18 11:26:22

标签: c# .net variables interface instance

据我所知,接口无法实例化。

如果这是真的,为什么以下代码编译并执行?它允许您创建可变接口。为什么这可能?

接口:

public interface IDynamicCode<out TCodeOut>
{        
    object DynamicClassInstance { get; set; }
    TCodeOut Execute(string value = "");
}

InCode:

var x = new IDynamicCode<string>[10];

结果:

Result

更新

只有在声明数组时才会发生。不是一个例子。

5 个答案:

答案 0 :(得分:16)

您没有实例化接口,而是实例化该接口的数组。

您可以将实现IDynamicCode<string>的任何类的实例分配给该数组。假设您有public class Foo : IDynamicCode<string> { },您可以将其实例化并将其分配给该数组的元素:

var x = new IDynamicCode<string>[10];
x[5] = new Foo();

实例化接口将无法编译:

var bar = new IDynamicCode<string>();

答案 1 :(得分:13)

您没有创建界面实例;你正在创建一个数组,它可以容纳许多符合IDynamicCode的对象。最初,条目具有默认值,即null

答案 2 :(得分:6)

这不是创建接口变量

这将创建一个数组,其中每个元素实现接口。如果你写x[0] = new IDynamicCode<string>();,那么你会得到错误。所有元素都是null,因此您需要为每个元素分配一个实现IDynamicCode的对象

答案 3 :(得分:5)

只是一个有趣的旁注:

虽然在概念上不可能,但在语法上确实可以在特定情况下实例化接口

.NET有一个名为CoClassAttribute的东西,告诉编译器将标记的接口解释为指定的具体类型。使用此属性将使以下代码完全有效,并且不会抛出编译时错误(请注意,这不是原始帖子中的数组):

var x = new IDynamicCode<string>();

此类属性的典型声明如下所示:

[ComImport]
[Guid("68ADA920-3B74-4978-AD6D-29F12A74E3DB")]
[CoClass(typeof(ConcreteDynamicCode<>))]
public interface IDynamicCode<out TCodeOut>
{
    object DynamicClassInstance { get; set; }
    TCodeOut Execute(string value = "");
}

是否应该使用此属性,是否,然后在哪里?答案是&#34;大多数情况下从来没有&#34;!但是,有两种特定于COM互操作的方案,这将提供一个有用的功能。

可以通过以下链接阅读有关该主题的更多内容:

答案 4 :(得分:3)

致电

var x = new IDynamicCode<string>[10];

不会调用构造函数。他们只是宣布。