这里的关键点是嵌套类可以访问外部类中的私有字段。
所以下面的代码有效:
public class Foo
{
private bool _field;
public static class Extensions
{
public static bool GetField(Foo foo)
{
return foo._field;
}
}
}
在这里,您显式传递了该类的一个实例,并且允许静态方法访问私有字段...似乎很合理:
bool fieldValue = Foo.Extensions.GetField(new Foo());
然而,虽然扩展方法只是静态方法的替代语法,但它们的调用方式与非静态实例方法相同。
现在,如果在嵌套类中允许扩展方法,它们实际上可以访问私有字段,并且它们将更接近于实例方法。这可能会导致一些意想不到的后果。
总之,如果允许这样做:
public class Foo
{
private bool _field;
public static class Extensions
{
public static bool GetField(*this* Foo foo) // not allowed, compile error.
{
return foo._field;
}
}
}
然后您可以编写以下代码,使扩展方法的行为更像一个实例方法,而不是应该的:
var foo = new Foo();
var iGotAPrivateField = foo.GetField();
根据评论进行编辑
为什么扩展方法等同于实例方法是个坏主意?
用Eric Lippert 的话(强调我的):
所以,是的,经常听到的批评“扩展方法不是面向对象的”是完全正确的,但也相当不相关。扩展方法当然不是面向对象的。他们将处理数据的代码远离声明数据的代码,他们无法打破封装并与他们似乎是方法的对象的私有状态对话,他们不能很好地处理继承,等等。他们穿着方便的面向对象的衣服进行过程编程。