none
VS2010 编译器bug RRS feed

  • 问题

  •       if (true)
          {
            if (false)
            {
              int i;
            }
    
            int i;//编译器报告说这里不能重复声明变量i, 但实际上在这个地方if(false)中的i早已经结束生命周期了. 这里编译报错应该是一个误判.
            i = 1;
          }
    
    
    • 已更改类型 Charles Shao 2011年2月6日 15:40 以前怎么显示为讨论了
    2011年1月30日 13:13

答案

  • 其实这不叫“结束生命周期”,结束生命周期只是在函数调用完毕,返回上一级调用栈时发生。

    但这确实是一个问题,以上代码在java中是可以编译通过的。

    dear
    不!!在if区块里宣告的变数,离开if区块后就结束生命周期,这比函数拥有更短的生命周期。
    我在猜是VS本身不允许在同一方法内宣告重复名称,这应该请MS工作人员向总部了解,我自己也很想知道

    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/


    明显就是一个bug, 不论是什么高级语言, 变量脱离生命周期以后,在语法生都应被看作已经消亡---不论内存是如何理解的.

    以上在C , C++ , Java 都是没有问题的. 显然是VS的Bug... 

    另, MVP不能直接与MS的人进行沟通或报告bug么?

    2011年2月6日 15:39

全部回复

  • 严格来说这并不算是BUG。因为无论在哪个块里声明,都是局部变量,除非函数结束否则不会释放(有错欢迎指正)。你这样声明还可能导致混乱。
    rrrfff
    2011年1月31日 2:00
  • dear
    虽然i的生命周期已结束,但VS不允许变数名称重复宣告。
    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/
    2011年1月31日 5:50
  • 其实这不叫“结束生命周期”,结束生命周期只是在函数调用完毕,返回上一级调用栈时发生。

    但这确实是一个问题,以上代码在java中是可以编译通过的。

    2011年2月2日 6:05
  • 其实这不叫“结束生命周期”,结束生命周期只是在函数调用完毕,返回上一级调用栈时发生。

    但这确实是一个问题,以上代码在java中是可以编译通过的。

    dear
    不!!在if区块里宣告的变数,离开if区块后就结束生命周期,这比函数拥有更短的生命周期。
    我在猜是VS本身不允许在同一方法内宣告重复名称,这应该请MS工作人员向总部了解,我自己也很想知道

    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/
    2011年2月2日 11:17
  • 其实这不叫“结束生命周期”,结束生命周期只是在函数调用完毕,返回上一级调用栈时发生。

    但这确实是一个问题,以上代码在java中是可以编译通过的。

    dear
    不!!在if区块里宣告的变数,离开if区块后就结束生命周期,这比函数拥有更短的生命周期。
    我在猜是VS本身不允许在同一方法内宣告重复名称,这应该请MS工作人员向总部了解,我自己也很想知道

    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/


    明显就是一个bug, 不论是什么高级语言, 变量脱离生命周期以后,在语法生都应被看作已经消亡---不论内存是如何理解的.

    以上在C , C++ , Java 都是没有问题的. 显然是VS的Bug... 

    另, MVP不能直接与MS的人进行沟通或报告bug么?

    2011年2月6日 15:39
  • 在C#中, 变量分为值类型和引用类型, 值类型存储在栈中, 引用类型存储在堆中. 但值类型在必要的时候会进行装箱操作, 也就是会存储在堆中. 必要的时候它也会拆箱回到栈中.

    这并不是BUG, 而是C#语言的特性.

    2015年6月18日 15:24