为什么C#不能在内部类里面声明一个扩展方法?

问题描述

C#声明一个扩展方法,必须是staticclass,static方法。我尝试把这个包含了扩展方法的类放在一个类的内部,结果编译出错了。为什么C#在语法上要有这样的限定呢?

解决方案

解决方案二:
语法要求,没啥好解释的……至于为什么,这个你得问微软了,一般谁没事去研究这东西,我们又不去开发一个语言
解决方案三:
语法本来就这么规定的,扩展方法必须是静态方法,所在类必须是静态类。
解决方案四:
就是这么规定的
解决方案五:
扩展方法本来就是给已经有的类增加功能,如果放到内部找起来就太费事了,楼主设计的什么功能如此见不得光啊
解决方案六:
扩展方法的那个静态类的命名空间和要被扩展的类命名空间不同吧?
解决方案七:
扩展方法的原意就是要‘扩展’已有的类,它不可以,也不能,改变已有类的逻辑。它只是用来方便代码的。也就是说,扩展方法可以做到了,不用扩展方法,也必须可以做到。但是,根据访问规则,内部类可以访问外部类的私有成员。如果允许在内部类里面声明一个扩展方法,那么该扩展方法可能成为内鬼。内鬼可以做到的,不用扩展方法就做不到,这种矛盾违背了程序员对‘扩展方法’的期待。publicclassCustomer{publicstringId{get;privateset;}publicstringAddress{get;set;}publicCustomer(stringid){Id=id;}publicstaticclassCustomerExtensions{publicstaticCustomerSetAddress(/*this*/Customercustomer,stringaddrress){customer.Id="newid";//内部类可以访问定义在外部的私有成员。customer.Address=addrress;returncustomer;}}}

解决方案八:
嗯,正如上面几位所说,如果你可以去随便修改别人的源代码(例如任何程序随时都去修改System.Core.dll中的某些代码),你就不需要扩展方法了。反之,如果你自己的程序中的普通类,那么也没有必要使用扩展方法。
解决方案九:
扩展方法的逻辑定义部分“找起来”很困难(相对于平铺直叙的普通方法而言),实际上不会因为语法时髦就滥用。扩展方法显然是增加了阅读困难度的,因此现在应该被谨慎地限制在最直观最傻瓜化的地方来定义。而问“为什么不可以随便声明”,则是过度滥用它了。

时间: 2024-10-15 14:28:29

为什么C#不能在内部类里面声明一个扩展方法?的相关文章

Spring中基于aop命名空间的AOP 二(声明一个切面、切入点和通知)

2.声明一个切面 在基于AOP命名空间的Spring AOP中,要声明一个切面,需要使用<aop:config/>的子标签 <aop:aspect>.<aop:aspect>标签有一个ref属性必须被赋值,它用于指定和该切面关联的 受管Bean(backing bean,以后我们都将使用Backing Bean来称呼这样的Bean).正如下例所示,该Bean 对应的java类是一个普通的java类,在该类中定义了切面的通知方法.此外,<aop:aspect>

javascript-js如何预声明一个jquery对象?

问题描述 js如何预声明一个jquery对象? 我用var $obj = {}声明,后期执行会报错$obj.animate is not a function,请问如何声明一个 jquery的对象? 解决方案 jquery对象并不意味着你引入了jquery的js以及你使用了其中代表jquery的符号$符号作为变量名的开头,这跟jquery一点关系都没有,jquery一般会提供我们一些根据他的规则获取的元素对象,比如:使用jquery获取一个input元素对象,并将其赋值给一个变量,那么,这个变量

mondodb-C#声明一个mongodb地理位置索引,并修改索引范围

问题描述 C#声明一个mongodb地理位置索引,并修改索引范围 默认情况下,mongodb地理空间索引假定你在索引经度/维度,并且这些值的范围是[-180180].但是我的坐标是大地坐标,不是经纬度,怎么在C#声明一个mongodb地理位置索引,并修改索引范围?shell是这样修改的:db.places.ensureIndex( { loc : ""2d"" } { min : -500 max : 500 } ) 解决方案 这里有现成的http://blog.c

从零开始学_JavaScript_系列(17)——dojo(6)(声明一个类declare)

(71)声明一个类declare 作用: 封装一个类,然后可以通过调用这个类,来调用其类方法.   优点: ①可以继承其他类的类方法:   ②假如我们需要使用一个类的类方法,而这个类依赖于5个插件.如果正常调用的话,我们需要在每个使用这个类的js文件里,调用这5个插件.当我们使用封装时,我们只需要调用这个类即可.而调用这个类的方法很简单.   ③可以使得代码模块化,按需加载.例如,我有封装好的A类B类C类,起初我用的是A类(假设A类依赖于20个插件),然后我可能弃用A类改用B类(B类使用与A类不

初学者求教,C++中在类内声明一个struct和另一个类,在类外怎么定义

问题描述 初学者求教,C++中在类内声明一个struct和另一个类,在类外怎么定义 template class List{ struct Node{}; ... class const_iterator{}; class iterator:public const_iterator{}; ... }; struct Node{ Object data; ... }; 这样定义出现了错误,但不知如何解决.并且模板Object在struct Node为何无法使用? 解决方案 类中定义一个stati

为什么java中的类里面还能声明一个静态的自己

问题描述 为什么java中的类里面还能声明一个静态的自己 如题,感觉这种情况好诡异,能不能解释一下下面这段代码的流程呢?代码如下 public class CameraInterface { private static final String TAG = "yanzi"; private Camera mCamera; private Camera.Parameters mParams; private boolean isPreviewing = false; private f

c++-我在头文件里声明一个变量,然后在Cpp里赋值,怎么不行呢?

问题描述 我在头文件里声明一个变量,然后在Cpp里赋值,怎么不行呢? 我的mfc程序里自定义了一个头文件,里面声明一个变量比如 int a和声明一个函数Init(): 然后自定义一个cpp,里面实现函数Init().在函数体里面给a赋值:a=6: 然后在另一个dialog cpp里TRACE这个值试试,结果说: fatal error LNK1169: 找到一个或多个多重定义的符号,已经在...obj中定义过.反正编辑时不报错,编译链接时报错.怎么回事? 我有很多变量,我希望有一个Init函数,

为什么JDBC编写DAO的时候,都是每一个方法中都声明一个PreparedStatement,而不是给DAO定义一个PreparedStatement成员变量?

问题描述 如题:为什么JDBC编写DAO的时候,都是每一个方法中都声明一个PreparedStatement,而不是给DAO定义一个PreparedStatement成员变量? 解决方案 解决方案二:PreparedStatement是Connection对象创建的吧,你要是定义一个成员变量,那么你就只能公用一条Connection了,如果你在其它什么地方把Connection关闭了,那个PreparedStatement就不能用了吧解决方案三:楼上正解,我之前试过定义成员变量的,但我多次aja

c#-C#中如何声明一个自定义类型的全局变量

问题描述 C#中如何声明一个自定义类型的全局变量 项目中添加一个Person.cs类文件定义了一个Person类想声明一个Person类型的全局变量应该如何做? 解决方案 在某个类中,声明 public static Person person