标签:
今天在进行代码测试时发现,尝试在一个方法中定义一个委托,注意是定义一个委托,而不是声明一个委托变量,在编写的时候没有报错,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#语法不允许这个理由还起来算合理,但若要问为什么不可以,请教多人却没有人能真正解答根本原因。
从编译器智能提示的程序集路径为 命名空间.类名.自定义类型名,而在方法中的实际路径应该为(我理解):命名空间.类名.方法签名.自定义类型名,两者匹配不到,所以报错。
同样的编程思想(即在方法中定义自定义类型)在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#语言为什么不支持,不支持总有它的理由吧?除了我上述分析的是因为类型程序集路径不正确导致,目前真没有合理的理由了,若者从报错的角度来说,是否是我的编写语法不对,如果局部定义不是这样,那又是怎样的呢?还请大家帮忙分析一下,指点迷津,非常感谢!
C#简单问题,不简单的原理:不能局部定义自定义类型(不含匿名类型)
标签:
原文地址:http://www.cnblogs.com/zuowj/p/4438338.html