28

我最近在使用 Array.SetValue(Int32) 方法时在 C# 中发现了一个异常。例外是:

无法从源类型扩展到目标类型,因为源类型不是原始类型或无法完成转换。

提到“原始”这个词让我有点吃惊,因为我认为倾向于将这些类型称为内置类型,而且“原始类型”这个词是一个非正式的术语。“原始”类型和“内置值类型”有什么区别?我在 C# 语言规范中没有找到原始类型的定义。

4

1 回答 1

39

C# 语言规范中未定义原始类型。它们是在 .NET 本身中定义的,原始类型的最佳参考是直接查看Type.IsPrimitiveMSDN。具体来说,备注部分列出了可用的基本类型。

所以我们在这里有一个完整的参考,这些是CLI 规范(第 I.8.2.2 节)中定义的原始类型:

与流行的看法相反,仅仅因为一个类型有一个相应的关键字并不能使它成为一个原始类型,最好的例子可能是string.

另一方面,值类型也可能是也可能不是原语。除了 CLI 规范中定义的值类型之外,.NET 框架中还有许多“内置”值类型,但它们不属于原语。一个很好的例子是DateTime.NET structFramework 提供的,根据该定义,它可以被视为“内置值类型”。您可以在此处阅读有关值类型的更多信息(当然也包括内置类型)。

于 2013-05-16T13:48:59.157 回答