我从这开始:
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; }
}
答案 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时使用。