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

时间:2011-10-26 23:11:04

标签: c# .net oop types boxing

为什么你可以做像

这样的事情
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

4 个答案:

答案 0 :(得分:6)

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

  

1.28值类型

     

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

...

  

1.28.4简单类型

     

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

...

  

因为简单类型别名为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
     

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

     

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

正如规范解释的那样,简单类型有一些超级大国就像const的能力一样,可以用一种特殊的文字语法来代替新的,并且能够在编译时间(2 + 2实际上在最终的MSIL流中写为4)

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

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

答案 1 :(得分:6)

Eric Lippert最近的文章Inheritance and Representation解释道。(Spoiler:你的遗产和代表性令人困惑。)

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

答案 2 :(得分:2)

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

答案 3 :(得分:0)

这样你就可以使用它们了!

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

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

相关问题