为什么在for循环里重复定义变量不会出错

为什么在for循环里重复定义变量不会报错?
如下代码1,
public  void text(){
int a;
int a;
return;}
因为重复定义了两个变量 a ,编译器报错。
如下代码2,
void test(){  
 for(int i=0;i<2;i++)    
 {       
 int a;    
}
return;
}
用for循环也是定义了两个变量a, 
编译器却不报错
我的问题是:
1.  为什么用for循环重复定义的变量不会报错?????? 
 2. 最终系统是怎样给代码2分配内存的?  
在该函数的栈上 有两个相同名称的变量吗? 
这样好像应该不可以吧。。。。。 
------解决方案--------------------
 2. 最终系统是怎样给代码2分配内存的?  
在该函数的栈上 有两个相同名称的变量吗? 

C#是不考虑诸如内存、堆栈的问题的。
在一对{ }里,变量名称不重复就可以了。
在i=0时,有了一个变量a,在i=1时,之前的变量a的生命周期已经结束了,那这个a就是不存在的,又定义了一个a,和之前的a一点关系也没有。至于内存、堆栈的问题,那都是系统的事,不是C#程序员的事,也关心不了。
------解决方案--------------------
局部变量的生存范围是{}之间。第二次循环已经出了{},再次进入{}了。