7

メソッド シグネチャが競合する 2 つのインターフェイスがあるとします。

interface IA
{
    void F();
}

interface IB
{
    int F();
}

そして今、次のようなクラスを作成します:

class Test : IA, IB
{
    public void F() { ... }
    int IB.F() { ... }
}

as という名前のメソッドはメソッドIB.Fのように見えますが、次のようなprivateことができます。

var t = new Test();
t.F();       //Calls public method F
((IB)t).F(); //Calls private method IB.F!!!

だから私の質問は:IB.F C# コンパイラは、クラス スコープ外で呼び出すことができることをどのように認識しますか?

その接頭辞だと思いますが、コードをIB.調べたところ、奇妙なシグネチャを持つメソッドとして表示されます。ILprivate

4

2 に答える 2

9

「プライベート」メソッドには以下が含まれます。

.method private hidebysig newslot virtual final instance int32 ns.IB.F() cil managed
{ 
    .override Tests.IB::F
    //...
}

そしてでIB

.method public hidebysig newslot abstract virtual instance int32 F() cil managed
{
}

.override、 の宣言を調べるようにコンパイラに指示しIBます。そこには、メソッドは と書かれていpublicます。

メソッドは実際には宣言されていません。デフォルトではprivate、「なし」はpublicインターフェースメソッドを意味します。

の前に任意の種類のアクセス修飾子を追加してみてくださいint IB.F()。明示的なインターフェイス実装のアクセシビリティを変更できない可能性があるため、コンパイラ エラーになります。

于 2013-05-31T18:47:01.333 に答える
2

次のような方法

int IB.F() { ... }

つまり.、名前にドットがあり、(最後の) ドットの前の名前の部分はインターフェイス名であり、通常のインスタンス メソッドではありません。いわゆる明示的インターフェースの実装です。

private通常の方法とは考えないでください。privateC# キーワードを明示的なインターフェイス実装と一緒に使用することは合法ではないことに注意してください。

ある意味で、このメソッドには、実装するインターフェイスのアクセシビリティがあります。

そのため、誰かがインターフェイスにキャストされたそのクラスのインスタンスを持っているときはいつでも呼び出すことができます。

internal例として、MSDN サイトでは、ドキュメントやprivateクラスのメンバーはありません。ただし、これらのメンバーは外部から (つまり、私たちによって) 呼び出すことができるため、明示的なインターフェイスの実装 (アセンブリの外部でインターフェイスが表示される場所) を文書化しますList<T>例については、クラスを参照してください。

于 2013-05-31T19:14:51.920 に答える