稍微混淆了明确声明与成员的接口的细节

Aar*_*ide 2 c# interface

我从这开始:

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

class C : IFoo
{
    public void F()
    {
    }
    string IFoo.X { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

它按照我的预期进行编译.没有惊喜.

然后我去看看:

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

class C : IFoo
{
    public void F()
    {
        X = "";
    }
    string IFoo.X { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

现在我得到'X在当前上下文中不可用'.

没想到.

我最终得到:

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

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

我从来没有想过这一点.

问题:上面的代码没有与我目前对thigns的理解相符,因为我看到了两个X. 在直观的层面上,我可以看到编译器不需要混淆.有人可以用他们的话说出这里的语言规则吗?

提前致谢.

回答后更新:我可以将接口转换为如下界面:

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

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

Gra*_*ton 5

因为您已经显式地实现了接口(通过编写string IFoo.X而不是仅仅string X),所以您只能通过接口访问该接口属性.

所以你需要这样做

public void F()
{
    ((IFoo)this).X = "";
}
Run Code Online (Sandbox Code Playgroud)

或者不明确声明接口,即

public string X { get; set; }
Run Code Online (Sandbox Code Playgroud)