2012-10-04 56 views
3
public interface IFoo 
{ 
    void Foo(bool flag = true); 
} 

public class Test : IFoo 
{ 
    void IFoo.Foo(bool flag = true) //here compiler generates a warning 
    { 

    } 
} 

警告說,給定的默認值將被忽略,因爲它在不允許它的上下文中使用。顯式實現的接口中的可選參數

爲什麼顯式實現的接口不允許使用可選參數?

+0

爲什麼你需要重寫在IFoo中指定的默認參數? – gabba

回答

2

顯式實現的接口方法始終是,調用的目標編譯時間類型是接口,而不是特定的實現,它被稱爲。編譯器通過它所「調用」的方法聲明它的可選參數。如果只知道IFoo類型的目標表達式,您會如何從Test.Foo中獲得參數?

IFoo x = new Test(); 
x.Foo(); // How would the compiler know to look at the Test.Foo declaration here? 
+0

我不認爲它試圖覆蓋它。我認爲這個實現必須被聲明爲類似於接口聲明,一字一句......我甚至不想重寫它。現在我明白了,這個假設是絕對錯誤的......現在這個警告確實有道理。 – horgh

+0

你並不是真的「壓倒一切」 - 你正在實施*。 –

+0

這就是爲什麼我想,編譯器不會想,我想改變參數的默認值 – horgh

0

我會使用方法重載。

public interface IFoo 
{ 
    void Foo(bool flag); 
    void Foo(); 
} 

public class Test : IFoo 
{ 
    void Foo() { 
     this.Foo(true); 
    } 

    void Foo(bool flag) { 
     // Your stuff here. 
    } 
} 
+0

當然,這也需要改變接口。 –

+0

糟糕...:D我會改變我的答案。 –