0


0

予期しないC#インターフェイス実装コンパイラエラー

今日、この奇妙な行動に出くわしました。

interface IFooBar
{
    void Foo();
    void Bar();
}

class FooBar : IFooBar
{
    void IFooBar.Foo()
    {
    }

    void IFooBar.Bar()
    {
        this.Foo();
    }
}

行this.Foo();コンパイラエラーを発生させます

_ 「MyProject.FooBar」には「Foo」の定義が含まれておらず、タイプ「MyProject.FooBar」の最初の引数を受け入れる拡張メソッド「Foo」が見つかりませんでした(usingディレクティブまたはアセンブリ参照がありませんか?) _

interface.method宣言スタイルではなくパブリックメソッドを選択すると、コードは次のようにコンパイルされます。

class FooBarOk : IFooBar
{
    public void Foo()
    {
    }

    public void Bar()
    {
        this.Foo();
    }
}

このエラーが発生する理由と、interface.method表記を使用して回避する方法を理解したい

3 Answer


1


コードでインターフェイス構文を使用してみましたか?

((IFooBar)this).Foo ();

実装が事実上隠されており、それを使用するために `IFooBar`にキャストする必要があることを保証するためだと思います。


1


これを回避するには、次のように記述できます。

((IFooBar)this).Foo();

`this.Foo()`が機能しない理由については、http://msdn.microsoft.com/en-us/library/aa288461(VS.71).aspx [明示的なインターフェイス実装のチュートリアル]をご覧ください。


0


これは、明示的なインターフェイス実装と呼ばれます。 これらのメソッドを公開せずにインターフェイスを実装できます。 たとえば、IDisposableを実装できますが、apiのユーザーにとってより意味のあるパブリックClose()メソッドを提供できます。 内部的には、IDisposable.Dispose()メソッドがCloseメソッドを呼び出します。

interface IFooBar
{
    void Foo();
    void Bar();
}

class FooBar : IFooBar
{
    void IFooBar.Foo()
    {
    }

    void IFooBar.Bar()
    {
        ((IFooBar)this).Foo();
    }
}

Fooメソッドを呼び出す方法です