这可能是一个愚蠢的问题,我忽略了一个明显的答案,但如果我有以下内容:
interface A { }
struct B {
A some_field;
}
那么B的默认ctor会让我看到它在字幕下的大小有多大?
换句话说(从另一个角度来看),接口类型的默认值是什么,它是否会被视为引用或值类型,因为类(引用)和结构(值)都可以从它继承?
答案 0 :(得分:9)
接口是引用类型。
接口类型的字段总是一个指针宽,默认为null
。
如果你指定一个实现接口的结构,那么结构将被装箱,并且该字段将包含对装箱对象的引用。
答案 1 :(得分:3)
正如SLaks所指出的那样,一个接口类型的变量将作为一个引用持有者,它将被称为永远不会包含除null
之外的任何内容或对实现该接口的对象的引用。与所有参考持有者一样,默认值为null
。
一个泛型类型的变量,它受约束于接口类型(例如在类
中)Thing<T> where T:IComparable<T>
{T foo;
...}
字段Foo
将具有与替换T
的实际类型相同的默认值。例如,给定
struct SimplePoint : IComparable<SimplePoint>
{public int x,y;
public int CompareTo(SimplePoint other)
{...}
...}
然后在Thing<SimplePoint>
内,字段Foo
将具有默认值(0,0)。
顺便提一下,值得注意的是,虽然从结构类型转换为任何引用类型(包括它实现的接口),但会产生对包含结构字段快照的新堆对象的引用,将该引用转换为其他引用类型将产生对同一堆实例的引用。