18

タイトルが完全に自明ではない場合、これが私を困惑させるコードです:

public interface IFoo<T>
{
}

public class MyClass : IFoo<MyClass.NestedInMyClass>
{
  private class NestedInMyClass
  {
  }
}

私はこれがエラーなしでコンパイルされることに驚いています。privateタイプを公開しているような気がします。これは違法ではないでしょうか?

たぶんあなたの答えは単に「それに対する規則はないのに、なぜそれは大丈夫ではないのか」ということになるでしょう。MyClass.NestedInMyClassおそらく、それが「範囲」にあることも同様に驚くべきことです。資格を削除するMyClass.と、コンパイルされません。

IFoo<>(ジェネリッククラスに変更し、それがの基本クラスになるMyClass場合、これ違法です。基本型は、少なくとも型自体と同じくらいアクセス可能でなければならないからです。)

Visual Studio 2010のC#4コンパイラでこれを試しました。

4

2 に答える 2

10

外部コードはオブジェクトをこのインターフェースにキャストできないため、アクセシビリティの問題ではありません。

publicクラスは実装privateinternalインターフェースも許可されています。同様に、外部コードから実際にキャストを行うことはできません。

Re:依存する実装についての議論T-明示的なインターフェイス実装を使用する場合は許可されます-その場合、インターフェイスのメソッドは事実上プライベートであるためです。例えば:

public interface IFoo<T>
{
  void DoStuff(T value);
}

public class MyClass : IFoo<MyClass.NestedInMyClass>
{
  void IFoo<MyClass.NestedInMyClass>.DoStuff(MyClass.NestedInMyClass value)
  {
  }
  private class NestedInMyClass
  {
  }
}

動作します(インターフェイス実装メソッドがクラス自体によって公開されていないため)。

于 2013-01-07T15:50:44.040 に答える
1

クラスがインターフェイスを実装するという事実は、インターフェイスタイプの格納場所を作成できるコードが、その格納場所にそのタイプへの参照を格納し、その格納場所でインターフェイスメンバーを使用できることを意味します。それ以外の場合はそのタイプの格納場所を作成する機能を持たないコードを作成するための新しい機能は提供されません。

パブリッククラスFooにプライベートタイプまたは内部タイプのインターフェイスを実装させると、へのキャスト参照にIBarアクセスできるコードが有効になります。アクセス権を持たないコードにアクセスできるという事実は、そのようなアクセス権を持っているコードによっても使用されないことを意味します。実際、定義されているアセンブリまたはクラスが、外の世界では利用できない機能を使用したいと考えるのはごく普通のことです。それが実装されているという事実は、そのような機能の1つにすぎません。IBarFooIBarFooIBarFooFooIBar

于 2013-01-07T16:27:38.670 に答える