C#编译器数字字面量

39

有人知道 C# 编译器数字字面量修饰符的完整列表吗?

默认情况下,声明 '0' 会将其视为 Int32 类型,而 '0.0' 则是 'Double' 类型。我可以在末尾使用字面量修饰符 'f',以确保某些内容被视为 'Single' 类型。例如像这样...

var x = 0;    // x is Int32
var y = 0f;   // y is Single

我可以使用哪些其他修饰符?是否有一种可以强制转换为Double、Decimal、UInt32的修饰符?我尝试通过谷歌搜索找到相关信息,但没有发现任何结果。也许是我术语用词不当导致无法得到结果。非常感谢您的帮助。

3个回答

72
var y = 0f; // y is single
var z = 0d; // z is double
var r = 0m; // r is decimal
var i = 0U; // i is unsigned int
var j = 0L; // j is long (note capital L for clarity)
var k = 0UL; // k is unsigned long (note capital L for clarity)

来自C#规范2.4.4.2整数字面量和2.4.4.3实数字面量。请注意,L和UL比它们的小写变体更易于理解,正如Jon Skeet所建议的那样。


21
虽然l在长整型中是有效的,但我建议使用L代替 - 它同样有效,而且不会看起来像"1"。 - Jon Skeet
2
@Jon Skeet:C程序员的坏习惯,已经采纳了您的建议。 - user7116
为什么0U要大写?我看不出0u有任何歧义。 - Caltor

14

如果您不想记住它们,那么编译器也接受强制类型转换来达到同样的目的(您可以检查 IL,效果相同 - 即编译器而非运行时执行转换)。借用之前的例子:

    var y = (float)0; // y is single
    var z = (double)0; // z is double
    var r = (decimal)0; // r is decimal
    var i = (uint)0; // i is unsigned int
    var j = (long)0; // j is long
    var k = (ulong)0; // k is unsigned long

顺便说一句,我同意在这里使用"var"是一个糟糕的选择;对于SortedDictionary<SomeLongType, SomeOtherLongType>,我很乐意使用var,但对于"int"来说,这只是懒惰...


@Marc Gravell:+1 建议使用强制类型转换,但有时需要使用后缀(比如说,不好的示例是 3.14159m)。个人观点是当我想要明确表达时使用强制类型转换。 - user7116
编译器将以下内容视为相同;您有一个示例,其中它会产生差异吗? var x = 3.14159m; var y = (decimal)3.14159; - Marc Gravell
@Marc Gravell:嗯,我想不出来了,只是作为一名C/C++程序员的直觉。我猜我不能把同样的东西视为理所当然!感谢您的提示。 - user7116
21
回答评论中的问题,(十进制)1.000000000000001计算结果为1,而1.000000000000001m计算结果为1.000000000000001。在前一种情况下,计算机将文字解析为double类型,然后强制转换为decimal类型。 - Joe Albahari

5
你可以从查看C#语言规范开始。大部分类型都列在其中,并带有后缀:
  • L = long
  • F = float
  • U = uint
  • ulong有一点不同
  • m = decimal(货币)
  • D = double
当然,如果停止使用var,则可以避免整个问题,并使您的代码更易读(好吧,这很主观,但对于类似此类的内容,其他人更容易阅读:
var x = 0; //whats x?
float x = 0; //oh, it's a float
byte x = 0; // or not!

@Nic Wise:+1 不要再使用 var 了 ;D 虽然它确实简化了显示哪个后缀与哪个类型相对应的过程。 - user7116
是的,非常好的观点 :) 我一般喜欢使用var,特别是在foreach语句中(foreach(var a in myList)),但除此之外,我不是它的铁粉。 - Nic Wise

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