为什么你可以做像
这样的事情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
答案 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>
处理。我们大多数都是两全其美的。