2013-11-10 142 views
4

假設我們有一個接口:C# - 鑄造的對象的接口

interface ICustomShape 
{ 
} 

,我們必須從Shape類繼承的類,並實現了接口:

public class CustomIsocelesTriangle : Shape, ICustomShape 
{ 

} 

會如何我會將CustomIsocelesTriangle投射到ICustomShape對象上,以便在「界面級別」上使用?

ICustomShape x = (ICustomShape)canvas.Children[0]; //Gives runtime error: Unable to cast object of type 'program_4.CustomIsocelesTriangle' to type 'program_4.ICustomShape'. 
+0

調試器中的'canvas.Children [0]'類型是什麼?如果它是'CustomIsocelesTriangle',你甚至不需要投射 - 如果它實現了'ICustomShape',它應該被接受。我的猜測是你正在看錯類型。 – xxbbcc

+0

canvas.Children [0]是CustomIsocelesTriangle類型。奇怪的是,它適用於我爲Ellipse使用內置幾何體時,但對於我定義了自己的路徑幾何體的任何對象,它會給出這個錯誤(儘管繪製形狀/ etc。一切正常) 。 – Shaku

+0

(我試過編輯帖子來命名界面更標準的'ICustomShape',但它會改變運行時錯誤信息...請考慮以下公共代碼的默認C#命名指南 - 即像'ISomeInterface'這樣的名稱界面) –

回答

5

如果你確信:

  1. canvas.Children[0]返回CustomIsocelesTriangle
    使用調試器來驗證,或打印類型控制檯:

    var shape = canvas.Children[0]; 
    Console.WriteLine(shape.GetType()); 
    // Should print "program_4.CustomIsocelesTriangle" 
    
  2. 你鑄造ICustomShape(不CustomShape)。

  3. CustomIsocelesTriangle implements ICustomShape
    試試這個驗證(它應該編譯):

    ICustomShape shape = new CustomIsocelesTriangle(/* Fake arguments */); 
    

那麼也許:

  • 你在不同的項目或裝配有CustomIsocelesTriangle,你忘了保存和重建後,它你使它實現了ICustomShape;
  • 或者,您引用該程序集的較舊版本;或者,您有兩個名爲ICustomShape的接口或兩個類CustomIsocelesTriangle(可能位於不同的名稱空間中),並且您(或編譯器)將它們混淆在一起。
+0

對不起 - 修正了我的記法。 CustomShape是ICustomShape,我只是沒有正確命名。 canvas.Children [0]是CustomIsocelesTriangle類型 – Shaku

+0

@Shaku在你的文章中,即使在所有的編輯之後,你仍然可以參考最後一行中的'CustomShape'(沒有'I')。你確定你沒有在你的代碼中犯同樣的錯字嗎? – Virtlink

+0

人們一直在編輯我的帖子......我現在修復了它。 – Shaku