2013-11-10 90 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