考虑以下代码:
double i = 0xF0000000;
Console.WriteLine(0xF0000000.GetType());
Console.WriteLine(i.GetType());
Run Code Online (Sandbox Code Playgroud)
为什么C#打印System.UInt32第一个和System.Double第二个?
那是因为,默认情况下编译器会将文字推断为类型var?
Jon*_*eet 56
在这一行:
double i = 0xF0000000;
Run Code Online (Sandbox Code Playgroud)
该文本是类型的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"));
}
}
Run Code Online (Sandbox Code Playgroud)
版画
123,456,789,012,345,678.00
123,456,789,012,346,000.00
Run Code Online (Sandbox Code Playgroud)
注意最后的几个数字是如何丢失的double,因为从隐式转换long到double可能会失去精度.(两者都有64位可用,但double只有部分位用于尾数.)
它不是文字int或uint文字的问题,但值得注意的是转换正在发生.
小智 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;
Run Code Online (Sandbox Code Playgroud)
这里x是十进制变量.为其分配uint值时,该值将隐式转换为小数(因此它将适合十进制变量).
| 归档时间: |
|
| 查看次数: |
3728 次 |
| 最近记录: |