【问题标题】:"Primitive types" versus "built-in value types"“原始类型”与“内置值类型”
【发布时间】:2013-05-11 10:41:14
【问题描述】:

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

也不能从源类型扩大到目标类型,因为源 类型不是原始类型或转换不能 完成。

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

【问题讨论】:

  • 原始类型是在 CLR 中定义的,而不是在 C# 中。 msdn.microsoft.com/en-us/library/aa711900.aspx
  • 示例:DateTime 是一种值类型,但它不是原始类型。 intchar 等是原语。
  • 您可以将其作为答案
  • @RudiVisser - 您发布的链接包含Visual Basic .NET defines the following primitive types:
  • @MartinSmith 确实,我在答案版本中链接了更好的资源。

标签: c# types


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-05
    • 2010-12-06
    • 1970-01-01
    • 1970-01-01
    • 2021-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多