2014-01-24 119 views
5

我的問題是關於在不同的接口沒有編譯時錯誤鑄造錯誤的類型時

類型轉換

假設我有一個接口

public interface I 
{ 
    void method(); 
} 

類實現它

public class C : I 
{ 
    public void method() 
    { 
    } 
} 

我有另一個接口

public interface I1 
{ 
    void method1(); 
} 

現在,如果我做這樣的事情

C c1 = new C(); 
((I1)c1).method1(); 

它拋出一個運行時異常,而不是一個編譯時錯誤

+0

這是顯而易見的,如何編譯器會知道你還沒有實現在類,接口,你想 – paritosh

+1

@paritosh什麼 - 恰恰相反 - 編譯器確實知道'I1'不是由執行C類「,但請參閱Scott Chamberlain提供派生類的例子。 –

+0

但直到密封正確? – paritosh

回答

12

因爲C沒有打上sealed我可能做到這一點

public D : C, I1 
{ 
    public void method1() 
    { 
    } 
} 

這將使下面的代碼完全合法。

C c1 = new D(); 
((I1)c1).method1(); 

如果C標記sealed因爲不能存在,可以被實現接口更派生類,你應該得到一個編譯時錯誤。

public sealed class C : I 
{ 
    public void method() 
    { 
    } 
} 

//You should now get the compile time error "Cannot convert type 'SandboxConsole.C' to 'SandboxConsole.I1'" 
+0

同樣的事情可能發生在類的情況下,但它確實會拋出一個編譯時錯誤,而不是異常,即使我們沒有使類被封。 – GPuri