zoukankan      html  css  js  c++  java
  • 吹毛求疵C#(1)明确赋值检查缺陷

    喜欢c#, 所以期望也比较高, 也就会留意一些不起眼的小缺陷, 也就会有很多改进的设想, 也就希望能和更多的朋友分享这些发现和畅想.

    (1)明确赋值检查缺陷

    截止到目前的MS C#4.0版编译器为止, 关于明确赋值检查都存在一个令人不爽的诡异问题, 而且也与ECMA标准不一致. 如下例所示:

    class DefinitelyAssignedTest
    {
            private static void CheckA()
            {
                int value;
                if (Maybe() && Expr(out value))
                {
                    Console.WriteLine(value); //OK
                }
            } 
    
            private static void CheckB()
            {
                int value;
                if (false && Expr(out value))
                {
                    Console.WriteLine(value); //Error
                }
            }
    
            private static void CheckC()
            {
                int value;
                if (false && Expr(out value) && Expr(out value))
                {
                    Console.WriteLine(value); //OK
                }
            }
    
            private static void CheckD()
            {
                int value;
                bool temp;
                if (temp = (Maybe() && Expr(out value)))
                {
                    Console.WriteLine(value); //Error
                }
            }
    
            static bool Expr(out int value)
            {
                value = 1;
                return true;
            }
    
            static bool Maybe()
            {
                return (Environment.TickCount & 1) == 0;
            }
    }

    其中仅有A和C是能编译通过的, 而B和D不行. 而事实上这4个例子都是"明确赋值"的, 而且按照ECMA标准也都应该是"明确赋值"的. 但当前编译器的实现却有着自己诡异的规则.

    虽然这对手写的代码不会带来什么问题, 换个写法就是了, 可是对于代码生成器来说, 却着实添了不少乱. 就想稀世的脸上落了只苍蝇, 无伤大雅, 但确实让人很不爽.

    09年6月我把这个问题反馈给了微软, 9月份有了解决方案......实现没改, 没问题,语言标准改了...这样就没有不一致了... 打哪指哪, 先射箭后画靶嘛.

    相关链接:https://connect.microsoft.com/VisualStudio/feedback/details/468882/definitely-assigned-after-true-expression-detection-works-improperly#

    如果您也喜欢C#语言, 并且发现了问题或有建议, 请反馈给开发者们, 让他们能做的更好.

  • 相关阅读:
    css做中划线与文字排版
    修复ios上第三方输入法弹出时输入键盘盖住网页没有进行相应滚动从而盖住表单输入框的问题
    一般活动页面之类简单的背景图内容布局方式
    compass的使用
    nodejs与sqlite
    ftp命令
    shell变量详解
    Vue CLI 3 使用百度地图
    centos7中安装python3
    redis集群安装问题/usr/share/rubygems/rubygems/core_ext/kernel_require.rb:55:in `require': cannot load such file -- redis (LoadError)
  • 原文地址:https://www.cnblogs.com/robird/p/1764374.html
Copyright © 2011-2022 走看看