C#简单问题,不简单的原理:不能局部定义自定义类型(不含匿名类型)_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > C#简单问题,不简单的原理:不能局部定义自定义类型(不含匿名类型)

C#简单问题,不简单的原理:不能局部定义自定义类型(不含匿名类型)

 2015/4/19 13:26:39  梦在旅途  程序员俱乐部  我要评论(0)
  • 摘要:今天在进行代码测试时发现,尝试在一个方法中定义一个委托,注意是定义一个委托,而不是声明一个委托变量,在编写的时候没有报错,VS也能智能提示,但在编译时却报语法不完整,缺少方括号,但实际查询并没有缺少,想不通原因,将委托定义移到类中,报错消失,编译成功了。先看一下报错的源码:(实际上不只委托类型,所有的自定义类型均报错)classClass2{publicvoidTest(){delegatevoidtestDel(stringp);//是错误的eventtestDeltestEvnt
  • 标签:C# 问题 自定义

今天在进行代码测试时发现,尝试在一个方法中定义一个委托,注意是定义一个委托,而不是声明一个委托变量,在编写的时候没有报错,VS也能智能提示,但在编译时却报语法不完整,缺少方括号,但实际查询并没有缺少,想不通原因,将委托定义移到类中,报错消失,编译成功了。

先看一下报错的源码:(实际上不只委托类型,所有的自定义类型均报错)

    class Class2
    {
        public void Test()
        {
             delegate void testDel(string p); //错误

             event testDel testEvnt;//testDel无法生效,所以这里是错误的

            struct teststruct //是错误的
            {
                public string TName
                {get;set;}
            };

             teststruct tStruct=new teststruct();  //teststruct无法生效,所以这里是错误的

            class testClass //是错误的
            {
                public string TTT
                {get;set;}
            };

            testClass tClass=new testClass(); //testClass无法生效,所以这里是错误的

            enum testenum //是错误的
            {
                A,
                B,
                C
            };

             testenum TEnum=testenum.A; //testenum无法生效,所以这里是错误的
        }
    }

报错的截图如下:

将这些类型移到类中定义,编译就成功,截图如下:

    class Class2
    {
        delegate void testDel(string p);

        struct teststruct
        {
            public string TName
            { get; set; }
        };

        class testClass
        {
            public string TTT
            { get; set; }
        };

        enum testenum
        {
            A,
            B,
            C
        };

        event testDel testEvnt;
        public void Test()
        {

            teststruct tStruct = new teststruct();

            testClass tClass = new testClass();

            testenum TEnum = testenum.A;
        }
    }

在没有合理的解释下,唯有C#语法不允许这个理由还起来算合理,但若要问为什么不可以,请教多人却没有人能真正解答根本原因。

其实还是让人不理解,匿名类型为什么能直接声明,而自定义的类型就不行了呢? 难道说MS使用匿名类型就是为了弥补不能局部定义自定义类型,从编程的角度讲,局部定义自定义类型应该是合理的,我想其原因可能与程序集有关,因为C#的所有类型必须显示定义在程序集下(除了匿名类型),而如果是放在方法中程序集就无法直接找到该类型的完整路径。 以下是VS智能提示的在方法中自定义类型的程序集完整路径:

从编译器智能提示的程序集路径为 命名空间.类名.自定义类型名,而在方法中的实际路径应该为(我理解):命名空间.类名.方法签名.自定义类型名,两者匹配不到,所以报错。

同样的编程思想(即在方法中定义自定义类型)在Javascript中却是可,以下是JS代码:

<html doctype>
<head>
    <title>Test</title>
</head>
<body>
    <script type="text/javascript">

        function Person(name) {
            this.Name = name;
            this.Say = function (age) {
                function Address(shen, shi, xian) { //定义Address类型的构造函数
                    this.Shen = shen;
                    this.Shi = shi;
                    this.Xian = xian;
                    this.GetFullAddress = function () {
                        return this.Shen + this.Shi + this.Xian;
                    };
                };

                var Addr = new Address("湖北省", "黄冈市", "XX县");//实例化一个Address类型
                alert("我叫" + this.Name + ",今年" + age + "岁!\n 来自:" + Addr.GetFullAddress());
            }
        }

        var P = new Person("zuowenjun");
        P.Say(29);

    </script>
</body>
</html>

运行的结果:

我在想JS都支持,C#语言为什么不支持,不支持总有它的理由吧?除了我上述分析的是因为类型程序集路径不正确导致,目前真没有合理的理由了,若者从报错的角度来说,是否是我的编写语法不对,如果局部定义不是这样,那又是怎样的呢?还请大家帮忙分析一下,指点迷津,非常感谢!

上一篇: Task Parallel Library02,更进一步 下一篇: 没有下一篇了!
发表评论
用户名: 匿名