为什么未装箱的类型有方法?

The*_*kle 1 .net c# oop boxing types

为什么你能这样做

int i = 10;
i.ToString();
'c'.Equals('d');
1.ToString();
true.GetType();
Run Code Online (Sandbox Code Playgroud)

在C#?那些东西就是原始的,文字的,未装箱的,或者这些东西的任何组合; 那为什么他们有方法呢?它们不是对象,因此不应该有方法.这种语法糖是否适用于其他方面?如果是这样,什么?我可以理解具有执行这些操作的函数,例如:

string ToString(int number)
{
  // Do mad code
  return newString;
}
Run Code Online (Sandbox Code Playgroud)

但在这种情况下,你会把它称为函数,而不是方法:

string ranch = ToString(1);
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?

编辑:

刚刚意识到C#不再是java克隆了,规则完全不同.哎呀:P

Jul*_*lia 6

他们的行为就是这样,因为规范是这么说的(而且非常好):

1.28价值类型

值类型是结构类型或枚举类型.C#提供了一组称为简单类型的预定义结构类型.简单类型通过保留字识别.

...

1.28.4简单类型

C#提供了一组称为简单类型的预定义结构类型.简单类型通过保留字标识,但这些保留字只是System命名空间中预定义结构类型的别名,如下表所述.

...

因为简单类型别名为struct类型,所以每个简单类型都有成员.例如,int具有在System.Int32中声明的成员以及从System.Object继承的成员,并且允许以下语句:

int i = int.MaxValue; // System.Int32.MaxValue constant
string s = i.ToString(); // System.Int32.ToString() instance method
string t = 123.ToString(); // System.Int32.ToString() instance method
Run Code Online (Sandbox Code Playgroud)

简单类型与其他结构类型的不同之处在于它们允许某些额外的操作:

大多数简单类型允许通过编写文字来创建值(§1.16.4).例如,123是int类型的文字,'a'是char类型的文字.C#一般不提供结构类型的文字,其他结构类型的非默认值最终总是通过这些结构类型的实例构造函数创建.

正如规范解释简单类型具有一些超能力,如能力,可以const使用的特殊文字语法而不是新的,以及在编译时计算的容量(2 + 2实际上在最终的MSIL中写为4流)

但是方法(以及运算符)不是特殊的超能力,所有结构都可以拥有它们.

可以从microsoft网站下载规范(适用于C#4.0,我的复制粘贴来自早期版本):C#语言规范4.0


Ray*_*hen 6

Eric Lippert最近发表的文章" 继承与表征"解释道.(剧透:你们正在混淆继承和表现.)

不确定为什么你声称整数i,字符'c'和整数1不是对象.他们是.

  • Jon:但那是编译器优化.当它是IL时,我们不再说c#了 (4认同)
  • 它们是物体.请参阅VirtualBlackFox的回复,其中规范说明"例如,int具有在System.Int32中声明的成员,并且成员继承自System.Object." `int`继承自`System.Object`.有关进一步讨论,请参阅Eric的文章. (2认同)
  • @Jon - 你怎么解释`typeof(int).BaseType.BaseType`的结果? (2认同)
  • 您将继承与表示混淆.不要求派生类与基类共享内存表示. (2认同)