如何定义 "Type" 的含义

How to define what "Type" means

摘自Eric Lippert's Blog about What the meaning of "is", is

A common conception of types is that a type is a set [...] of values, and that assignment compatibility is merely checking to see if a given value is a member of the necessary set. But that’s not the case in C#.

他给出的反例是 null is string returns false,但是 string b = null 对于 C# 编译器来说完全没问题。

也许这是一个愚蠢的问题,但是在 C#.Net 上下文中定义 "type" 的想法的更好方法是什么?它只是用来定义...内存占用规则的词吗? ... 到 CLR?我意识到这个定义是多么松散(而且错误得可怕),但我正在努力寻找一个漂亮的包装器并围绕类型的想法鞠躬。

注意:越简单但又完全准确越好。 (强 N type,此处)。

Type 的传统英语定义是一个很好的起点。

a category of people or things having common characteristics.

a .NET 类型定义了特定类别的 .NET 对象(即:System.IO.Stream)。它包含一组特定类型的 .NET 对象的属性和方法(特征)。

您是否正在寻找更技术性的描述(即:内存管理等)?

根据 Programming Guide

,我认为您可能对这个有点想多了。

类型中存储的信息可以包括以下内容:

  • 类型变量需要的存储空间space。
  • 它能表示的最大值和最小值。
  • 它包含的成员(方法、字段、事件等)。
  • 它继承自的基类型。
  • 将在 运行 时分配变量内存的位置。
  • 允许的操作种类。

我知道这并不能说明 null 但在 c# 中 null 实际上只是缺少引用的内存地址。

多了解一些上下文有助于回答您的问题 ("[...] define the idea of 'type' in a C#.Net context[...]"),但这里只是简单介绍一下。 .NET 中类型的概念来自 object-oriented programming, and is a generalization of the datatype 前 OOP 编程语言的概念。在最简单的形式中,你可以说...

A type is a named template for a structure, instances of which hold data and/or behavior.


编辑部分问题的答案:

[...] how does the CLR treat the idea of a type?

我不太清楚你的意思,但是 CLR 中的一个类型——我上面定义中的 'named template'——在物理上存储为 CIL 并在系统中表示通过一个本身(像所有对象一样)属于一种类型的对象。

在这种情况下,该类型确实被命名为 System.Type。 (如果您好奇的话,这种类型实际上存储在 mscorlib 程序集中。)我知道我在自己的定义中使用了一个术语,但很难不这样做,因为这个概念本质上是递归的。

[...] does the CLR need to implicitly cast null to a string in the assignment string s = null? Answers so far imply no, it does not, but what allows that assignment? Is null just treated as a special case here?

是的,这是一种特殊情况,不,编译器和 CLR 转换都不是 null to a string(或其他任何东西)。 null 没有类型 (1) 并且不能转换为任何类型——它是一个特殊的 "value" 表示没有值 (2) 因此可以赋值给任何引用类型的变量 (3).



(1) 根据您所看到的位置,它 may or may not be of type "null type"

(2) 这样的值将是该类型实例的 reference

(3) 有 two kinds of types -- reference types and value types -- and null truly only applies to the former kind. It can appear in source code (e.g. int? i = null;) as being assigned to a variable of a nullable value type,但这只是语法糖,幕后发生的事情非常不同,与本次讨论仅无关。

这里有一些类似问题的很好的答案: Why does the is operator return false when given null?

此处对空文字进行了更详尽的讨论: What is the type of null literal?

似乎在早期版本的 .NET 中曾经有一个 null 类型用于符号目的,但随后在后续版本中被删除。

从 IL 程序员的角度来看,我可以说当 'if(myvar == null)' 这样的语句用 IL 编写时,它会是这样的:

Ldloc myvar
brfalse IfNullLabel

仅使用一条 IL 指令检查变量是否存在空引用,无论其类型如何。如果将其与另一个字符串进行比较,则会调用 Equals 方法。所以在内部,当它的引用指向 null 文字时,该值是 null。就这么简单。

what is a better way to define the idea of "type" in a C#.Net context? Is it just a word used to define ... memory footprint rules? I'm struggling to fit a nice wrapper and bow around the idea of type.

这是一个棘手的问题。您以 link 打开了我关于 is 的文章,但我认为您真正想阅读的是这篇文章:

http://blogs.msdn.com/b/ericlippert/archive/2011/08/29/what-is-this-thing-you-call-a-quot-type-quot-part-one.aspx

http://blogs.msdn.com/b/ericlippert/archive/2011/09/07/what-is-this-thing-you-call-a-quot-type-quot-part-two.aspx

简要说明:

从 "mathematical" 的角度来看,类型就像一个数字:我们可以使用规则来操纵的抽象数量。比如"if T is a type then T[] is also a type",等等。

一旦我们有了类型的抽象概念,我们就可以为每个表达式分配一个类型,然后我们可以制作一个自动确定程序是否遵循类型安全规则的验证器。