36

有谁知道 C# 编译器数字文字修饰符的完整列表?

默认情况下,声明 '0' 使其成为 Int32 和 '0.0' 使其成为 'Double'。我可以在末尾使用文字修饰符“f”来确保将某些内容视为“单一”。比如像这样...

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

我可以使用哪些其他修饰符?是否有一个强制加倍,​​十进制,UInt32?我试着用谷歌搜索,但找不到任何东西。也许我的术语是错误的,所以这解释了为什么我会出现空白。非常感谢任何帮助。

4

3 回答 3

65
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推荐的小写变体。

于 2008-10-03T13:11:21.350 回答
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”在这里是一个糟糕的选择;我很乐意将 var 用于 SortedDictionary<SomeLongType, SomeOtherLongType>,但对于“int”,它只是懒惰......

于 2008-10-03T13:21:33.437 回答
5

您可能想从查看 C# 语言规范开始。大多数类型都在其中列出,并有一个后缀:

  • L = 长
  • F = 浮动
  • U = 单位
  • 乌龙有点不同
  • m = 十进制(钱)
  • D = 双

当然,如果您停止使用var ,那么您就可以解决整个问题,并且您的代码变得更具可读性(好吧,这是主观的,但是对于这样的事情,其他人更具可读性:

var x = 0; //whats x?
float x = 0; //oh, it's a float
byte x = 0; // or not!
于 2008-10-03T13:17:03.057 回答