我是C#的新手,想要了解价值观是如何运作的.如果我查看一个正常的整数值,它有三个重要部分:类型,名称和值.
int testInt = 3; | | | Type Name Value
但是当我看到浮点值时,由于后缀,它会让我感到困惑F
.
float testFloat = 3.0F; | | | | Type Name Value Type
现在有两种类型,如果没有F
后缀,则值为double.但是,当我可以用声明双变量时,为什么会发生这种情况
double testDouble = 3.0D;
将double
作为第一个词应该是足够了,不应该吗?带有后缀M的十进制值也是如此:
decimal testDecimal = 3.0M;
然后,当涉及到其他后缀时,它开始让我感到困惑:
ulong bigOne = 2985825802805280508UL;
我ulong
之前在测试中使用过,并且知道它u
是"无符号"的,并且它的值是正常值的两倍.然后你再次得到U作为后缀,谷歌的文字就像谷歌说的那样.据我了解,"文字"是包含数字的值类型.但我不明白的是,即使没有后缀,为什么这个ulong工作呢?
ulong bigOne = 2985825802805280508;
然后我尝试了不同的东西来理解后缀的重要性
byte testLong = 12312UL;
这不起作用,因为字节(254)的值太高而后缀不会将其转换为长变量.
为什么第一个单词(类型)不足以申报?第一个词应该足以告诉类型.最好的做法是始终为值赋予后缀吗?
你在这里混淆了两件不同的事情:
float testFloat = 3.0F;
该float
告诉编译器变量testFloat
时便会浮点值.该F
告诉编译器的文字 3.0
是float
.编译器需要先了解这两个部分,然后才能决定是否可以使用无转换或隐式转换将字面值分配给变量.
例如,您可以这样做:
float testFloat = 3;
那没关系.因为编译器将看到3
一个文字整数,但它知道它可以将它分配给一个浮点而不会丢失精度(这是隐式转换).但是如果你这样做:
float testFloat = 3.0;
3.0
是一个文字双(因为这是没有后缀的默认值)并且它不能隐式(即自动)将double转换为float,因为float的精度较低.换句话说,信息可能会丢失.所以你要么告诉编译器它是文字浮点数:
float testFloat = 3.0f;
或者你告诉它你可以通过使用显式转换来降低精度:
float testFloat = (float)3.0;
所有1个表达式都需要可解析为一个类型.所以表达式42
总是需要只有一种类型(碰巧是一种int
).int
如果将其分配给int
变量,double
则它不能是a,如果将其分配给a,则不能double
.一个表达式中使用的上下文是从未1用来确定它解析为何种类型.
这就是数字文字可以有后缀的原因; 它是一种在该表达式中定义该表达式类型的方法.
请注意,许多数字类型之间也存在隐式转换,因此如果您编写double d = 42;
表达式42
实际上是一个整数,但是在其上执行了一个隐式转换运算符,它将double
在赋值之前将其转换为a .
1这里有一些例外,例如lambdas,表达式的类型取决于它的使用方式和方法组; 在真空中这些表达没有类型.