为什么.Net引用类型中的接口?

ric*_*ard 12 .net types interface reference

为什么接口引用类型?据我所知,接口是类(或结构)之间的契约,那为什么它是一个类型呢?我原以为它既不是值类型也不是引用类型.

Mar*_*ell 11

要被视为结构,编译器必须在编译时知道具体类型是什么,以在堆栈上保留正确的空间.这意味着即使结构实现IFoo,然后使用:

var ms = new MyStruct();
IFoo foo = ms;
Run Code Online (Sandbox Code Playgroud)

然后分配到foo拳击操作.你可以说"编译器应该发现它只是foo并使用'constained'操作码",但在一般情况下(有多个赋值foo等)这是不可能的(我会冒险猜测它会遇到"停滞问题").

还存在虚拟和静态调用的问题,但"受约束"的操作码可以解决这个问题.

基本上,必须始终将接口的任何用法视为参考.

这有一个例外:通用约束.

如果你有

static void DoBar<T>(T target) where T : IFoo {
    target.Bar();
}
Run Code Online (Sandbox Code Playgroud)

这里的方法是每个值类型JITted一次,因此所需的堆栈空间T 已知的; 呼叫Bar是"受约束的",可以根据需要自动进行虚拟或静态.