AsV*_*leO 7 .net c# variables interface instance
据我所知,接口无法实例化.
如果这是真的,为什么下面的代码编译和执行?它允许您创建可变接口.为什么这可能?
接口:
public interface IDynamicCode<out TCodeOut>
{
object DynamicClassInstance { get; set; }
TCodeOut Execute(string value = "");
}
Run Code Online (Sandbox Code Playgroud)
InCode:
var x = new IDynamicCode<string>[10];
Run Code Online (Sandbox Code Playgroud)
结果:

更新:
它只在声明数组时发生.不是一个例子.
Cod*_*ter 16
您没有实例化接口,而是该接口的数组.
您可以将实现的任何类的实例分配IDynamicCode<string>给该数组.假设你有public class Foo : IDynamicCode<string> { },你可以实例化它并将其分配给该数组的元素:
var x = new IDynamicCode<string>[10];
x[5] = new Foo();
Run Code Online (Sandbox Code Playgroud)
实例化接口将无法编译:
var bar = new IDynamicCode<string>();
Run Code Online (Sandbox Code Playgroud)
这不是创建接口变量
这将创建一个数组,其中每个元素实现接口.如果你写, x[0] = new IDynamicCode<string>();那么你会得到错误.所有元素都是null,所以你需要为每个元素分配一个实现的对象IDynamicCode
只是一个有趣的旁注:
虽然在概念上不可能,但在语法上确实可以在特定情况下实例化接口.
.NET有一个叫做CoClassAttribute的东西,它告诉编译器将标记的接口解释为指定的具体类型.使用此属性将使以下代码完全有效,并且不会抛出编译时错误(请注意,这不是原始帖子中的数组):
var x = new IDynamicCode<string>();
Run Code Online (Sandbox Code Playgroud)
这种属性的典型声明如下所示:
[ComImport]
[Guid("68ADA920-3B74-4978-AD6D-29F12A74E3DB")]
[CoClass(typeof(ConcreteDynamicCode<>))]
public interface IDynamicCode<out TCodeOut>
{
object DynamicClassInstance { get; set; }
TCodeOut Execute(string value = "");
}
Run Code Online (Sandbox Code Playgroud)
是否应该使用此属性,如果,那么在哪里?答案是"绝大多数都没有"!但是,有两种特定于COM互操作的方案,这将提供一个有用的功能.
可以从以下链接中阅读有关该主题的更多信息: