1

.NET中,所有值类型都继承自名为System.ValueType的类。System.ValueType是一个类,所以它是一个reference type.

我的问题是 a 如何以及为什么可能value type从 a 派生reference type

4

4 回答 4

6

以下是文档中的关键段落

尽管 ValueType 是值类型的隐式基类,但您不能创建直接从 ValueType 继承的类。相反,各个编译器提供语言关键字或构造(例如 C# 中的 struct 和 Visual Basic 中的 Structure...End Structure)来支持值类型的创建。

当编译器编译System.Object. 该类System.ValueType只是提供更合适的重载ToString()GetHashCode()。正如文档所述,如果使用struct关键字(在 C# 中),编译器将使用这些重载。这告诉编译器使用System.ValueType方法而不是System.Object方法。

于 2012-11-26T11:46:24.910 回答
2

这是可能的,因为作为值类型或引用类型不是继承的。这同样适用于Enum。类本身是引用类型,但枚举是值类型。

于 2012-11-26T11:46:32.327 回答
1

一个可能更简单的例子是所有值类型都派生自System.Object,它也是一个引用类型。

int i = 3;
int j = 3;
object io = i;
object jo = j;

此时,iojo是引用 和 值的副本的i引用j。可以使用强制转换再次提取这些值:

int i2 = (int)io;
int j2 = (int)jo;

从功能上讲,这大致就像转换为在幕后object创建一个对象一样工作,并设置为. 演员表从到然后读取。class ValueWrapper<T> { public T value; }ionew ValueWrapper<int> { value = i }ioint((ValueWrapper<int>)io).value

这并不完全是发生的事情,但确实发生的事情足够相似,希望这可以充分澄清。

于 2012-11-26T11:57:08.527 回答
0

Eric LippertThe C# Programming Language 4th Edition中说:

这一点经常让新手感到困惑。我经常被问到,“但是值类型怎么可能派生自引用类型呢?” 我认为这种混淆是由于对“源自”含义的误解造成的。派生并不意味着基类型的内存中的位布局可以在派生类型的位布局中找到。相反,它只是意味着存在某种机制,可以从派生类型访问基类型的成员。

于 2012-12-10T16:09:15.270 回答