为什么未装箱类型有方法

本文关键字:类型 有方法 为什么 | 更新日期: 2023-09-27 18:12:25

为什么你可以做这样的事情

int i = 10;
i.ToString();
'c'.Equals('d');
1.ToString();
true.GetType();
在c#

吗?这些东西要么是原始的,文字的,未装箱的,要么是这些东西的任意组合;那么它们为什么有方法呢?它们不是对象,因此不应该有方法。这是语法糖吗?如果有,那是什么?我可以理解让函数做这些事情,例如:

string ToString(int number)
{
  // Do mad code
  return newString;
}

,但在这种情况下,你会调用它作为一个函数,而不是一个方法:

string ranch = ToString(1);

这是怎么回事?

编辑:

刚刚意识到c#不再是java的克隆,规则也完全不同。哦:P

为什么未装箱类型有方法

它们这样做是因为规范是这样说的(这很好):

1.28值类型

值类型要么是结构类型,要么是枚举类型。c#提供了一组预定义的结构类型,称为简单类型。简单类型通过保留字标识。

简单类型c#提供了一组预定义的结构类型,称为简单类型。简单类型是通过保留字来标识的,但是这些类中预定义结构类型的别名系统名称空间,如下表所示。

因为简单类型是结构类型的别名,所以每个简单类型都有成员。例如,int具有在System中声明的成员。Int32,从System继承的成员。对象,以及以下语句允许:

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

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

大多数简单类型允许通过编写文字来创建值(§1.16.4)。例如,123是int类型的字面值,'a'是achar类型的字面量。c#没有提供结构的字面量类型是通用的,而其他结构类型的非默认值是最终总是通过它们的实例构造函数创建结构体类型。

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

但是方法(以及操作符)并不是一种特殊的超能力,所有的结构体都可以拥有它们。

规范(对于c# 4.0,我的复制粘贴来自较早的版本)可以从微软网站下载:c#语言规范4.0

Eric Lippert最近的文章《继承和表示》解释了。(剧透:你混淆了继承和表示)

不确定为什么您声称整数i,字符'c'和整数1不是对象。div。

在c#中,所有的基本类型实际上都是结构。

以便您可以使用它们!

这样做很方便,所以你可以。

现在,为了做到这一点,可以将原语视为结构体。例如,一个32位整数可以被处理为32位整数,但它也可以被处理为public struct Int32 : IComparable, IFormattable, IConvertible, IComparable<int>, IEquatable<int>。我们通常是两全其美