2010-09-16 43 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