使用var时的C#For循环类型推断

时间:2011-11-08 11:39:59

标签: c# for-loop int type-inference var

考虑以下代码......

            double total = Int32.MaxValue;
            total++;

            int previousX = 0;

            for (var x = 0; x <= total; x++)
            {
                if (x == Int32.MaxValue)
                {
                    Console.WriteLine("Int32 max reached.");
                }

                if (x < 0)
                {
                    Console.WriteLine("Counter now < 0.");
                }

                previousX = x;
            }

看来,如果你将var与for循环一起使用,那么默认的类型推断就是int。

这是否正确,因为如果计数器超过了int 32的最大值,而不是溢出堆栈,它会将自身重置为零,然后从零开始倒计时。

注意:previousX允许您​​设置断点并查看计数器“x”的先前值是什么。

有谁知道为什么会这样?

似乎可以通过使用var作为for循环的计数器来进入一些泡菜。

8 个答案:

答案 0 :(得分:6)

x的类型由初始值决定,上面是整数文字0

如果您希望x为双倍,请使用双重文字0D

答案 1 :(得分:3)

重要的是要理解var关键字并不意味着“变体”,并不表示变量是松散类型或后期绑定。它只是意味着编译器确定并分配最合适的类型。如您var x=0,它会确定xint以匹配0。 所以是的,这是正确的功能。

由于数字表示负数的方式(两个恭维),当数字包裹其最大值时,它将显示为从-1开始重置和倒计时。

在循环的迭代完成之前,x++的增量不会发生。

答案 2 :(得分:2)

当然,如果你将一个int增加到MaxValue之后,它会回到MinValue并从那里开始递增。

答案 3 :(得分:2)

这确实很有趣,但与var的使用无关。 使用int(或实际上是long,short等)时仍会发生这种情况。

这里的实际罪魁祸首是循环的MAX值大于int32的最大值。当数值递增时,数字将换行,从而导致无限循环。你可以声明var x,int x,short x,所有这些都会以类似的方式循环。

递增数值的本质会导致“环绕”。您可以通过运行以下代码并在增量之后观察值以及之后来尝试它。 (如果添加减量,这也有效。)

        int a = Int32.MaxValue;
        Console.WriteLine(a);
        a++;
        Console.WriteLine(a);

        short b = Int16.MaxValue;
        Console.WriteLine(b);
        b++;
        Console.WriteLine(b);

        long c = Int64.MaxValue;
        Console.WriteLine(c);
        c++;
        Console.WriteLine(c);

另外,发布的代码片段中的var通过语句var x = 0设置为int。“0”本身是一个int,因此x的类型设置为int。如果你声明var x = 0F或0L,则类型会有所不同。

答案 4 :(得分:1)

Var确切类型由您使用=运算符定义。 c# 0的类型为int,因此编译器正在使用int

答案 5 :(得分:1)

这里没什么特别的。 var将被推断为Int32,因为这是0的默认值。如果您想长时间使用var x = 0L。或者只是long x = 0

答案 6 :(得分:1)

var x = 0将推断x是一个整数,因为你使用的是整数文字(“0”)。

查看有关整数溢出的相关帖子:

why this would result in long integer overflow

答案 7 :(得分:0)

这看起来很简单:

var x = new User()

当编译器看到这一行时,他用var替换User,因为那是构造函数返回的。函数调用也是如此:

var x = y.ToString()

ToString()返回string,因此编译器知道要替换var的内容。

写作时

var x = 0

您实际上是致电int构造函数,因此var将替换为int

您有三种选择:

  • double x = 0 ...
  • var x = 0.0 ...
  • var x = 0D ...

注意:D后缀适用于double