Неожиданная ошибка компилятора реализации интерфейса c # - PullRequest
0 голосов
/ 16 сентября 2010

Я только что столкнулся с этим странным поведением сегодня:

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

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

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

Строка this.Foo (); выдает ошибку компилятора

«MyProject.FooBar» не содержит определение для "Foo" и без расширения Метод «Foo» принимает первый аргумент типа «MyProject.FooBar» может быть найден (вы пропускаете используя директиву или сборку ссылка?)

Если я выбираю открытые методы вместо стиля объявления interface.method, код компилируется:

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

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

Я бы хотел понять, почему возникает эта ошибка и как ее можно обойти, используя нотацию interface.method

Ответы [ 3 ]

1 голос
/ 16 сентября 2010

Вы пытались использовать синтаксис интерфейса в коде?

((IFooBar)this).Foo ();

Я ожидаю, что это потому, что реализация эффективно скрыта, гарантируя, что вы должны привести его к IFooBar, чтобы использовать его.1005 *

1 голос
/ 16 сентября 2010

Чтобы обойти это, вы можете написать:

((IFooBar)this).Foo();

Взгляните на Явное руководство по реализации интерфейса , чтобы ответить, почему this.Foo() не работает.

0 голосов
/ 16 сентября 2010

Это называется явной реализацией интерфейса.Это позволяет вам реализовать интерфейс, не раскрывая эти методы публично.Например, вы могли бы реализовать IDisposable, но предоставить публичный метод Close (), который может иметь больше смысла для пользователей вашего API.Внутренне метод IDisposable.Dispose () вызовет ваш метод Close.

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

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

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

- это способ вызова метода Foo

...