C# 为什么接口变量实例化是可能的?

C# 为什么接口变量实例化是可能的?,c#,.net,variables,interface,instance,C#,.net,Variables,Interface,Instance,据我所知,接口不能被实例化 如果这是真的,为什么下面的代码要编译和执行?它允许您创建一个变量接口。为什么这是可能的 接口: public interface IDynamicCode<out TCodeOut> { object DynamicClassInstance { get; set; } TCodeOut Execute(string value = ""); } 公共接口IDynamicCode { 对象DynamicCl

据我所知,接口不能被实例化

如果这是真的,为什么下面的代码要编译和执行?它允许您创建一个变量接口。为什么这是可能的

接口:

public interface IDynamicCode<out TCodeOut>
{        
    object DynamicClassInstance { get; set; }
    TCodeOut Execute(string value = "");
}
公共接口IDynamicCode
{        
对象DynamicClassInstance{get;set;}
TCodeOut Execute(字符串值=”);
}
国际编码:

var x = new IDynamicCode<string>[10];
var x=新的IDynamicCode[10];
结果:

更新:


它仅在声明数组时发生。没有一个例子

您不是在实例化接口,而是该接口的数组

您可以将实现
IDynamicCode
的任何类的实例分配给该数组。假设您有
公共类Foo:IDynamicCode{}
,您可以实例化该类并将其分配给该数组的一个元素:

var x = new IDynamicCode<string>[10];
x[5] = new Foo();
var x=新的IDynamicCode[10];
x[5]=新的Foo();
实例化接口将不会编译:

var bar = new IDynamicCode<string>();
var bar=new IDynamicCode();

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

这不是创建接口变量

这将创建一个数组,其中每个元素实现接口。如果您编写
x[0]=新的IDynamicCode()然后您将得到错误。所有元素都是
null
,因此您需要为每个元素分配一个对象,当您调用

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

不调用构造函数。它们只是申报的

只是一个有趣的旁注:

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

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

var x=新的IDynamicCode();
此类属性的典型声明如下所示:

[ComImport]
[Guid("68ADA920-3B74-4978-AD6D-29F12A74E3DB")]
[CoClass(typeof(ConcreteDynamicCode<>))]
public interface IDynamicCode<out TCodeOut>
{
    object DynamicClassInstance { get; set; }
    TCodeOut Execute(string value = "");
}
[ComImport]
[Guid(“68ADA920-3B74-4978-AD6D-29F12A74E3DB”)]
[CoClass(typeof(Concrete DynamicCode))]
公共接口代码
{
对象DynamicClassInstance{get;set;}
TCodeOut Execute(字符串值=”);
}
是否应该使用此属性?如果使用,则在何处使用?答案是“绝大多数情况下不会”!然而,有几个特定于COM互操作的场景,这将提供一个有用的特性

有关该主题的更多信息,请访问以下链接:


您创建了一个数组。您仍然没有实例化接口。您正在新表达式中使用接口类型,但正在实例化实现该接口的代理对象。值得注意的是,在这种情况下,新表达式不会生成表达式中指定类型的对象。这是完全正确的。虽然这种表达式的语法可以被认为是“实例化接口”,但实际上一个具体的对象是通过CoClassAttribute的编译器知识在幕后实例化的。你们说的是同一件事,但我更喜欢@Laurent LA RIZZA的表述方式。在这个场景中,您使它看起来像是在实例化一个接口,而实际上您是在指示编译器使用代理类作为接口的默认替换类型。由于Java高度关注封装,并且代码的外观可以独立于其功能进行定制(这是很常见的),因此我认为在这种“奇怪”的情况下,必须明确这不是一种黑客行为,并且不会以任何方式违反语言规则。
[ComImport]
[Guid("68ADA920-3B74-4978-AD6D-29F12A74E3DB")]
[CoClass(typeof(ConcreteDynamicCode<>))]
public interface IDynamicCode<out TCodeOut>
{
    object DynamicClassInstance { get; set; }
    TCodeOut Execute(string value = "");
}