据我所知,接口无法实例化。
如果这是真的,为什么以下代码编译并执行?它允许您创建可变接口。为什么这可能?
接口:
public interface IDynamicCode<out TCodeOut>
{
object DynamicClassInstance { get; set; }
TCodeOut Execute(string value = "");
}
InCode:
var x = new IDynamicCode<string>[10];
结果:
更新
只有在声明数组时才会发生。不是一个例子。
答案 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];
不会调用构造函数。他们只是宣布。