在.NET
中,所有值类型都继承自名为System.ValueType的类。System.ValueType
是一个类,所以它是一个reference type
.
我的问题是 a 如何以及为什么可能value type
从 a 派生reference type
?
在.NET
中,所有值类型都继承自名为System.ValueType的类。System.ValueType
是一个类,所以它是一个reference type
.
我的问题是 a 如何以及为什么可能value type
从 a 派生reference type
?
以下是文档中的关键段落
尽管 ValueType 是值类型的隐式基类,但您不能创建直接从 ValueType 继承的类。相反,各个编译器提供语言关键字或构造(例如 C# 中的 struct 和 Visual Basic 中的 Structure...End Structure)来支持值类型的创建。
当编译器编译System.Object
. 该类System.ValueType
只是提供更合适的重载ToString()
等GetHashCode()
。正如文档所述,如果使用struct
关键字(在 C# 中),编译器将使用这些重载。这告诉编译器使用System.ValueType
方法而不是System.Object
方法。
这是可能的,因为作为值类型或引用类型不是继承的。这同样适用于Enum。类本身是引用类型,但枚举是值类型。
一个可能更简单的例子是所有值类型都派生自System.Object
,它也是一个引用类型。
int i = 3;
int j = 3;
object io = i;
object jo = j;
此时,io
和jo
是引用 和 值的副本的i
引用j
。可以使用强制转换再次提取这些值:
int i2 = (int)io;
int j2 = (int)jo;
从功能上讲,这大致就像转换为在幕后object
创建一个对象一样工作,并设置为. 演员表从到然后读取。class ValueWrapper<T> { public T value; }
io
new ValueWrapper<int> { value = i }
io
int
((ValueWrapper<int>)io).value
这并不完全是发生的事情,但确实发生的事情足够相似,希望这可以充分澄清。
Eric Lippert在The C# Programming Language 4th Edition中说:
这一点经常让新手感到困惑。我经常被问到,“但是值类型怎么可能派生自引用类型呢?” 我认为这种混淆是由于对“源自”含义的误解造成的。派生并不意味着基类型的内存中的位布局可以在派生类型的位布局中找到。相反,它只是意味着存在某种机制,可以从派生类型访问基类型的成员。