考虑以下代码......
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循环的计数器来进入一些泡菜。
答案 0 :(得分:6)
x
的类型由初始值决定,上面是整数文字0
。
如果您希望x
为双倍,请使用双重文字0D
。
答案 1 :(得分:3)
重要的是要理解var关键字并不意味着“变体”,并不表示变量是松散类型或后期绑定。它只是意味着编译器确定并分配最合适的类型。如您var x=0
,它会确定x
为int
以匹配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)
答案 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