Немного запутался из-за особенностей явного объявления интерфейса с участником - PullRequest
2 голосов
/ 22 октября 2010

Я начал с этого:

interface IFoo
{
    string X { get; set; }
}

class C : IFoo
{
    public void F()
    {
    }
    string IFoo.X { get; set; }
}

Он скомпилирован, как я и ожидал.Не удивительно.

Затем я перехожу к этому:

interface IFoo
{
    string X { get; set; }
}

class C : IFoo
{
    public void F()
    {
        X = "";
    }
    string IFoo.X { get; set; }
}

Теперь я получаю «X недоступно в текущем контексте».

Не ожидал этого.

Я получаю:

interface IFoo
{
    string X { get; set; }
}

class C : IFoo
{
    public void F()
    {
        X = "";
    }
    private string X;
    string IFoo.X { get; set; }
}

И я бы никогда не подумал об этом.

Вопрос:Приведенный выше код не совпадает с моим нынешним пониманием Thins, потому что я вижу два X.На интуитивном уровне я вижу, что компилятору не нужно запутываться.Может кто-нибудь выразить это словами своих правил игры здесь?

Заранее спасибо.

Обновление после ответа: я мог бы выполнить приведение к интерфейсу, как показано ниже:

interface IFoo
{
    string X { get; set; }
}

class C : IFoo
{
    public void F()
    {
        (IFoo(this)).X = "";
    }
    string IFoo.X { get; set; }
}

Ответы [ 3 ]

5 голосов
/ 22 октября 2010

Поскольку вы реализовали интерфейс явно (написав string IFoo.X вместо string X), вы можете получить доступ к этому свойству интерфейса только через интерфейс.

Так что вам нужно сделать

public void F()
{
    ((IFoo)this).X = "";
}

Или не объявлять интерфейс явно, т.е.

public string X { get; set; }
3 голосов
/ 22 октября 2010

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

См. spec .

2 голосов
/ 22 октября 2010

Ваша явная реализация IFoo.X в основном ограничивает использование IFoo.X случаями, когда экземпляр C рассматривается как IFoo.Если вы удалите явную реализацию, вы получите свойство X, которое удовлетворяет интерфейсу IFoo и может использоваться при обработке класса как C, так и IFoo.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...