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

时间:2010-10-22 14:50:19

标签: c# interface

我从这开始:

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; }
}

我从来没有想过这个。

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

提前致谢。

回答后更新:我可以按如下方式输入界面:

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

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

3 个答案:

答案 0 :(得分:5)

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

所以你需要做

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

或者不明确声明接口,即

public string X { get; set; }

答案 1 :(得分:3)

显式接口实现不是类的常规命名成员,并且不能通过类类型的名称访问(除非将其强制转换为接口)

请参阅spec

答案 2 :(得分:2)

您对IFoo.X的显式实现基本上将IFoo.X的使用限制为将C实例视为IFoo的情况。如果删除显式实现,您将获得满足IFoo接口的属性X,并且可以在将类视为C和IFoo时使用。