2010-09-16 66 views
0

我只是碰到这种怪异的行为走到今天:意外的C#接口实现的编译器错误

interface IFooBar 
{ 
    void Foo(); 
    void Bar(); 
} 

class FooBar : IFooBar 
{ 
    void IFooBar.Foo() 
    { 
    } 

    void IFooBar.Bar() 
    { 
     this.Foo(); 
    } 
} 

线this.Foo();引发编译器错误

“MyProject.FooBar”不包含一个 定义为“富”和没有扩展 方法“富”接受型的第一 参数“MyProject.FooBar” 可以发现( ?您使用的指令或程序集 参考缺少 )

如果让我选择的公共方法,而不是interface.method声明风格,代码编译:

class FooBarOk : IFooBar 
{ 
    public void Foo() 
    { 
    } 

    public void Bar() 
    { 
     this.Foo(); 
    } 
} 

我想明白为什么会引发错误,以及如何利用周围的interface.method符号

回答

1

要解决它,你可以这样写:

((IFooBar)this).Foo(); 

看看在Explicit Interface Implementation Tutorial的答案,为什么this.Foo()不起作用。

+0

谢谢你的链接和魔术句:“当一个成员被明确实现时,它不能通过类实例访问,而只能通过接口的一个实例。” – devio 2010-09-16 16:45:28

0

这就是所谓的显式接口实现加工。它可以让你实现一个接口而不公开地公开这些方法。例如,你可以实现IDisposable,但提供一个公共的Close()方法,这对你的api的用户可能更有意义。在内部,IDisposable.Dispose()方法会调用你的Close方法。

interface IFooBar 
{ 
    void Foo(); 
    void Bar(); 
} 

class FooBar : IFooBar 
{ 
    void IFooBar.Foo() 
    { 
    } 

    void IFooBar.Bar() 
    { 
     ((IFooBar)this).Foo(); 
    } 
} 

是一种方式为您调用美孚方法

1

您是否尝试过在代码中使用接口的语法?

((IFooBar)this).Foo(); 

我希望它是因为实施有效的隐藏,确保你必须为了使用它,它强制转换为IFooBar