考虑以下代码:
double i = 0xF0000000;
Console.WriteLine(0xF0000000.GetType());
Console.WriteLine(i.GetType());
C#为什么在第一个打印出 System.UInt32
,而在第二个打印出System.Double
?
这是因为编译器默认将字面量推断为var
类型吗?
考虑以下代码:
double i = 0xF0000000;
Console.WriteLine(0xF0000000.GetType());
Console.WriteLine(i.GetType());
C#为什么在第一个打印出 System.UInt32
,而在第二个打印出System.Double
?
这是因为编译器默认将字面量推断为var
类型吗?
在这行中:
double i = 0xF0000000;
literal
是 uint
类型,但它被隐式地转换为 double
。当你调用 i.GetType()
时,它总是会打印出 System.Double
,因为这个变量是 double
类型... 它唯一能够容纳的值就是 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
字面值而言,这不是一个问题,但是值得注意的是进行了转换。
- 如果字面量没有后缀,则它具有以下类型中可以表示其值的第一个类型:int、uint、long、ulong。
- 如果字面量以 U 或 u 结尾,则它具有以下类型中可以表示其值的第一个类型:uint、ulong。
- 如果字面量以 L 或 l 结尾,则它具有以下类型中可以表示其值的第一个类型:long、ulong。
- 如果字面量以 UL、Ul、uL、ul、LU、Lu、lU 或 lu 结尾,则它是 ulong 类型。
0xF0000000 没有后缀,因此它具有可以表示它的第一个类型(int、uint、long、ulong)。
所以0xF0000000的类型是uint。
decimal x = 0xF00000000;
这里 x 是一个十进制变量。当你将一个 uint 值赋值给它时,该值会被隐式转换为十进制(以便适应十进制变量)。
var
这种类型。 - Damien_The_Unbeliever