考虑以下代码:
double i = 0xF0000000;
Console.WriteLine(0xF0000000.GetType());
Console.WriteLine(i.GetType());
为什么C#会为第一个打印System.UInt32
而为第二个打印System.Double
?
这是因为,默认情况下编译器会将文字推断为类型var
吗?
答案 0 :(得分:57)
在这一行:
double i = 0xF0000000;
类型为uint
,但它被隐式转换为double
。当您致电i.GetType()
总是打印System.Double
时,因为该变量的类型为double
... only 种它可以容纳的值是double
。
请注意,如果您从double
或long
开始,则转化为ulong
意味着您可能会失去精确度。例如:
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位可用,但在double
中只有一些位用于尾数。)
int
或uint
文字不是问题,但值得注意的是转换正在发生。
答案 1 :(得分:12)
根据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)
所以0xF0000000的类型为uint。
decimal x = 0xF00000000;
这里x是十进制变量。为其分配uint值时,该值将隐式转换为小数(因此它将适合十进制变量)。