如何从数组中转换对象

时间:2010-06-30 09:21:55

标签: c# casting

一个简单的问题......

我有一个抽象类Cell和两个类BorderCell和BoardCell,它们继承自Cell类。然后我有一个Cell数组,其类型为Cell [],其中包含BorderCell和BoardCell类型的对象。

abstract class Cell 
{
}
class BorderCell : Cell 
{
    public void Method1(){};
}
class BoardCell: Cell
{
    public void Method2(){};
}

...

Cell[] Cells = new Cell[x];
for (int i = 0; i < x; i++){
    Cells[i] = new BorderCell();
    // or
    Cells[i] = new BoardCell();
}

现在我想将一个单元格转换为BorderCell并运行它的Method1,如下所示:

(Border)Cells[i].Method1();

但这不起作用,我必须使用:

BorderCell borderCell = (BorderCell)Cells[i];
borderCell.Method1();

这是唯一(并且正确的方式)这样做吗?

4 个答案:

答案 0 :(得分:7)

不,你只需要用括号来清楚你想要演员要应用的内容:

((Border)Cells[i]).Method1();

基本上是“。”绑定比演员更紧,所以原始代码:

(Border)Cells[i].Method1();

相当于:

(Border)  (Cells[i].Method1());

答案 1 :(得分:4)

尝试:

((BorderCell)Cells[i]).Method1();

如果您使用铸造,括号会提供类型边界。你的第一次尝试没有包裹Cell [i]。

答案 2 :(得分:3)

写作时

(BorderCell)Cells[i].method1();

广告素材已应用于Cells[i].method1();表达式,由于Cells[i]仍然会返回Cell,因此显然无效。

如果您想要备用其他变量,请写下:

((BorderCell)Cells[i]).method1();

答案 3 :(得分:2)

由于您将2种类型的单元格(BorderCell和BoardCell)放入数组中。我建议在施法前先检查一下类型。

if (Cells[i] is BorderCell)
{
// cast to BorderCell
}
else
{
// cast to BoardCell
}