考虑这段代码:
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
。
请注意,如果您从 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 位可用,但在 double
中只有其中一些位用于尾数。)
对于 int
或 uint
字面量来说这不是问题,但值得注意的是转换正在进行。
关于c# - C# 如何知道文字的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33951651/