【问题标题】:How does C# know what type the literal is?C# 如何知道文字是什么类型?
【发布时间】:2015-11-27 06:45:49
【问题描述】:

考虑这段代码:

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

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

这是因为默认情况下编译器将文字推断为var 类型吗?

【问题讨论】:

  • 没有类型var

标签: c#


【解决方案1】:

在这一行:

double i = 0xF0000000;

literaluint 类型,但它被隐式转换为double。当您调用i.GetType() 时,它总是 会打印System.Double,因为变量的类型是double...only 它可以保存的值是double.

请注意,如果您以 longulong 开头,则此转换为 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 中最后几位数字是如何丢失的,因为从longdouble 的隐式转换可能会丢失精度。 (两者都有 64 位可用,但在 double 中只有其中一些位用于尾数。)

对于 intuint 文字来说这不是问题,但值得注意的是转换正在发生。

【讨论】:

    【解决方案2】:

    根据Integer Literals (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 值时,该值会隐式转换为小数(因此它将适合十进制变量)。

    【讨论】:

      猜你喜欢
      • 2013-06-02
      • 1970-01-01
      • 2013-02-16
      • 1970-01-01
      • 2012-09-04
      • 1970-01-01
      • 2012-08-01
      • 2012-09-15
      • 1970-01-01
      相关资源
      最近更新 更多