为什么接口引用类型?据我所知,接口是类(或结构)之间的契约,那为什么它是一个类型呢?我原以为它既不是值类型也不是引用类型。
答案 0 :(得分:11)
要被视为结构,编译器必须知道在编译时具体类型是什么,以在堆栈上保留正确的空间。这意味着即使结构实现IFoo
,然后使用:
var ms = new MyStruct();
IFoo foo = ms;
然后对foo
的赋值是装箱操作。你可以说“编译器应该发现,只有永远的foo和使用‘constained’代码”,但在一般情况下的(多分配到foo
等)这ISN不可能(我猜测它会遇到“停止问题”)。
还存在虚拟与静态调用的问题,但“约束”操作码可以解决这个问题。
基本上,必须始终将接口的任何用法视为参考。
这有一个例外:通用约束。
如果你有
static void DoBar<T>(T target) where T : IFoo {
target.Bar();
}
这里的方法是每值型即时编译一次,所以所需要的堆栈空间T
的是强>已知的;对Bar
的调用是“受约束的”,可以根据需要自动虚拟或静态。
答案 1 :(得分:3)
它们是引用类型,因为值类型在编译时具有固定大小,因此可以在堆栈上分配它们。引用类型是指针,因此指针是常量大小的,但它们可以指向任何大小的内存。