C#如何知道字面量的类型?

15

考虑以下代码:

double i = 0xF0000000;
Console.WriteLine(0xF0000000.GetType());
Console.WriteLine(i.GetType());

C#为什么在第一个打印出 System.UInt32,而在第二个打印出System.Double

这是因为编译器默认将字面量推断为var类型吗?


54
没有 var 这种类型。 - Damien_The_Unbeliever
2个回答

56

在这行中:

double i = 0xF0000000;
literaluint 类型,但它被隐式地转换为 double。当你调用 i.GetType() 时,它总是会打印出 System.Double,因为这个变量是 double 类型... 它唯一能够容纳的值就是 double
请注意,这种转换为 double 就意味着如果你一开始使用的是 longulong 类型,你可能会失去精度。例如:
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 时,最后几位数字可能会丢失,因为从 longdouble 的隐式转换可能会损失精度。(两者都有64个可用的位,但是在 double 中只有一部分用于尾数。)
对于 intuint 字面值而言,这不是一个问题,但是值得注意的是进行了转换。

12
根据 C# 整数字面量,整数字面量的类型取决于其值和后缀。
  • 如果字面量没有后缀,则它具有以下类型中可以表示其值的第一个类型: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)。

  • int 是32位有符号数:0xF0000000刚好超出了它正数范围的限制 - 接下来...
  • uint 是32位无符号数:0xF0000000在它的范围内 - 没问题。

所以0xF0000000的类型是uint。

decimal x = 0xF00000000;

这里 x 是一个十进制变量。当你将一个 uint 值赋值给它时,该值会被隐式转换为十进制(以便适应十进制变量)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接