ここで重要な点は、ネストされたクラスが外部クラスのプライベート フィールドにアクセスできることです。
したがって、次のコードが機能します。
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 の言葉(強調は私のもの) :
そうです、「拡張メソッドはオブジェクト指向ではない」というよく耳にする批判は完全に正しいですが、むしろ無関係でもあります。拡張メソッドは確かにオブジェクト指向ではありません。データを操作するコードをデータを宣言するコードから遠く離れた場所に配置し、カプセル化を破ることができず、メソッドであると思われるオブジェクトのプライベートな状態と対話することができず、継承をうまく処理できません。これらは、便利なオブジェクト指向のドレスを着た手続き型プログラミングです。