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

为什么接口是.Net引用类型?,.net,interface,types,reference,.net,Interface,Types,Reference,为什么接口是引用类型?据我所知,接口是类(或结构)之间的契约,那么为什么它是一种类型呢?我会认为它既不是值类型也不是引用类型。要被视为结构,编译器必须在编译时知道具体类型是什么,以便在堆栈上保留正确的空间。这意味着,即使结构实现了IFoo,那么: var ms = new MyStruct(); IFoo foo = ms; 然后对foo的赋值是装箱操作。您可以说“编译器应该发现它只是一个foo,并使用'consteed'操作码”,但在一般情况下(对foo等有多个赋值),这是不可能的(我会冒险

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

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

var ms = new MyStruct();
IFoo foo = ms;
然后对
foo
的赋值是装箱操作。您可以说“编译器应该发现它只是一个foo,并使用'consteed'操作码”,但在一般情况下(对
foo
等有多个赋值),这是不可能的(我会冒险猜测它会遇到“停止问题”)

还有一个虚拟调用与静态调用的问题,但是“受限”操作码可以解决这个问题

基本上,接口的任何使用都必须始终作为参考

有一个例外:通用约束

如果你有

static void DoBar<T>(T target) where T : IFoo {
    target.Bar();
}
static void-DoBar(T目标),其中T:IFoo{
target.Bar();
}

这里,每个值类型对方法进行一次JIT,因此
T
所需的堆栈空间是已知的;对
Bar
的调用是“受约束的”,可以根据需要自动进行虚拟或静态调用。

它们是引用类型,因为值类型在编译时具有固定大小,因此可以在堆栈上进行分配。引用类型是指针,所以指针的大小是恒定的,但它们可以指向任何大小的内存。

为什么说接口是引用类型?我刚刚参加了70-536的练习考试,它说接口是引用类型之一(以及类和委托).@nader这是一个参考类型…@Mar。。。是的,我真的没想清楚。我在想界面其实什么都不是。但实现接口的东西必须被视为引用类型……好吧,我明白了。所以MyStruct实现了foo,它仍然是一种值类型。但一旦你把我的指令给福,它就被装箱了。foo的行为使其成为引用类型。此外,foo可以被分配一个值类型,然后是一个引用类型,它永远不知道,所以它必须作为一个引用类型来覆盖所有场景。。。这些都对吗?