2013-07-23 72 views
3

为什么在一个不是静态的类中声明/实现扩展方法是不可能的?在非静态泛型类中没有扩展方法?

我知道扩展方法是用于不可实例化类型的。但为什么不在可实例化的类中实现呢?这是什么原因?这是技术问题,还是仅仅为了更快地找到方法或强制更好的软件设计?

+0

可能的重复[为什么不支持C#静态类扩展方法?](http://stackoverflow.com/questions/4909156/why-arent-c-sharp-static-class-extension-methods-supported) –

+0

重复的http://stackoverflow.com/questions/3930335/why-are-extension-methods-only-allowed-in-non-nested-non-generic-static-class –

回答

1

您可以定义一个类,静态的,如果你想保证它 不能被实例化,不能获得或作为基地 另一种类型,并且只能包含静态成员。

http://msdn.microsoft.com/en-us/library/vstudio/79b3xss3.aspx

有扩展方法是编辑:静new'd在子类和这样将是一个真正的痛苦。

如同所有类类型的情况下,用于静态 类的类型信息由.NET Framework公共语言运行库(CLR) 当加载引用类的程序装载。

静态类在初始化优先级链上更高,使实现更高效。

+1

我会假设,静态类,扩展方法本身仍然需要“静态”,因此无论如何你都无法覆盖它们。 –

+0

@ChrisSinclair - 我的意思是新的修饰符http://msdn.microsoft.com/en-us/library/51y09td4%28v=vs.71%29.aspx#vclrfnew_newmodifier –

+0

同样的区别。静态方法属于它们声明的类型。当在类(或其派生子类)内部调用静态方法而没有明确指示类型时,使用'new'隐藏静态方法仅具有效果。除非你建议如果你在命名空间'A'上声明了基类'Bar'的扩展方法,在名称空间'B'中声明了一个派生类'Foo:Bar',然后添加'使用B;'来导入扩展方法从'B.Foo',它会抓取并从'A.Bar'抓取扩展方法呢? **害怕** –

0

LINQ只需要静态,非泛型,非嵌套类中的扩展方法来工作,这就是它的设计和实现方式。如果它需要非静态的,通用的嵌套类,它将以这种方式实现。