C#如何知道文字的类型?
考虑以下代码:
double i = 0xF0000000; Console.WriteLine(0xF0000000.GetType()); Console.WriteLine(i.GetType());
为什么C#为第一个打印System.UInt32
为第二个打印System.Double
?
那是因为,编译器默认情况下将文字推断为var
类型?
在这一行:
double i = 0xF0000000;
文字是uint
类型,但它被隐式转换为double
。 当你调用总是打印System.Double
i.GetType()
,因为变量是double
类型…它可以容纳的唯一值是double
。
请注意,如果您从long
或ulong
开始,此转换为double
意味着您可能会失去精度。 例如:
using System; public class Program { static void Main() { long x = 123456789012345678; double y = 123456789012345678; Console.WriteLine(x.ToString("n")); Console.WriteLine(y.ToString("n")); } }
版画
123,456,789,012,345,678.00 123,456,789,012,346,000.00
注意double
最后几位数字是如何丢失的,因为从long
到double
的隐式转换会丢失精度。 (两者都有64位可用,但只有一些,只有一些位用于尾数。)
这对于int
或uint
文字来说不是问题,但值得注意的是转换正在发生。
根据Integer Literals(C#) ,整数文字的类型取决于值及其后缀。
- 如果文字没有后缀,则它具有这些类型中的第一个,其值可以表示为:int,uint,long,ulong。
- 如果文字后缀为U或u,则它具有这些类型中的第一个,其值可以表示为:uint,ulong。
- 如果文字后缀为L或l,则它具有这些类型中的第一个,其值可以表示为:long,ulong。
- 如果文字后缀为UL,U1,uL,ul,LU,Lu,lU或lu,则其类型为ulong。
0xF0000000没有后缀,所以它有第一个可以表示它的类型 (int,uint,long,ulong)
- int是32位有符号的:0xF0000000就在它的正值范围之外 – 下一个……
- uint是32位无符号的:0xF0000000在它的范围内 – 好的。
所以0xF0000000有类型uint。
decimal x = 0xF00000000;
这里x是十进制变量。 为其分配uint值时,该值将隐式转换为小数(因此它将适合十进制变量)。