这可能是一个愚蠢的问题,我忽略了一个明显的答案,但如果我有以下情况:
interface A { }
struct B {
A some_field;
}
那么 B 的默认 ctor 会让我得到什么,因为它在引擎盖下会有多大(以字节为单位)?
换句话说(从另一个角度来看),接口类型的默认值是什么?它会被认为是引用类型还是值类型,因为类(引用)和结构(值)都可以从它继承?
接口是引用类型。
接口类型的字段将始终为一个指针宽,并且默认为null
.
如果您分配一个实现接口的结构,该结构将被装箱,并且该字段将包含对装箱对象的引用。
正如 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)。
顺便说一句,值得注意的是,虽然从结构类型转换为任何引用类型,包括它实现的接口,都会产生对包含结构字段快照的新堆对象的引用,将该引用转换为其他引用类型将产生对同一堆实例的引用。