接口类型的默认值

时间:2013-08-16 16:23:44

标签: c# interface struct

这可能是一个愚蠢的问题,我忽略了一个明显的答案,但如果我有以下内容:

interface A { }
struct B {
    A some_field;
}

那么B的默认ctor会让我看到它在字幕下的大小有多大?

换句话说(从另一个角度来看),接口类型的默认值是什么,它是否会被视为引用或值类型,因为类(引用)和结构(值)都可以从它继承?

2 个答案:

答案 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)。

顺便提一下,值得注意的是,虽然从结构类型转换为任何引用类型(包括它实现的接口),但会产生对包含结构字段快照的新堆对象的引用,将该引用转换为其他引用类型将产生对同一堆实例的引用。