2010-10-22 26 views
2

我开始用这样的:轻度的意识模糊了明确声明接口的细节与成员

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

回答

5

因为您明确实现了您的界面(通过编写string IFoo.X而不是仅仅是string X),您只能通过界面访问该界面属性。

所以你需要做的

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

或者未显式声明的接口,即

public string X { get; set; } 
+1

我一直觉得这是一个无赖'。'在这种特殊情况下它保持着高优先级,这会很好(ifoo)this.X – 2010-10-22 15:15:38

+0

是的,或者甚至有一个独立的运算符,就像他们在C++中做的那样(我似乎记得它是 - >,例如'(IFoo )这 - > X') – 2010-10-22 16:02:51

3

显式接口实现是不是类的常规命名的成员,并且不能按名称在类类型被访问(除非您将其投射到接口)

请参阅spec

2

你明确的实施IFoo.X的基本限制使用IFoo.X的案件C的实例被视为IFoo。如果你删除了显式的实现,你会得到一个满足IFoo接口的属性X,并且可以在将类作为C以及IFoo对待时使用。