C# 如何从数组强制转换对象

C# 如何从数组强制转换对象,c#,casting,C#,Casting,一个简单的问题 我有一个抽象类Cell和两个类BorderCell和BoardCell,它们继承自Cell类。然后我有一个Cell[]类型的Cells数组,其中包含BorderCell和BoardCell类型的对象 abstract class Cell { } class BorderCell : Cell { public void Method1(){}; } class BoardCell: Cell { public void Method2(){}; } ...

一个简单的问题

我有一个抽象类Cell和两个类BorderCell和BoardCell,它们继承自Cell类。然后我有一个Cell[]类型的Cells数组,其中包含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 borderCell = (BorderCell)Cells[i];
borderCell.Method1();

这是唯一(也是正确的方法)做到这一点吗?

不,你只需要用括号来清楚地说明你想让演员扮演什么:

((Border)Cells[i]).Method1();
基本上,“.”绑定比强制转换更紧密,因此您的原始代码:

(Border)Cells[i].Method1();
相当于:

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

不需要,您只需要用括号来清楚说明您希望强制转换应用于什么:

((Border)Cells[i]).Method1();
基本上,“.”绑定比强制转换更紧密,因此您的原始代码:

(Border)Cells[i].Method1();
相当于:

(Border)  (Cells[i].Method1());
尝试:

如果将括号用于转换,则括号提供类型边界。您的第一次尝试没有包装单元格[i]。

请尝试:

如果将括号用于转换,则括号提供类型边界。您的第一次尝试没有包装单元格[i]。

写入时

(BorderCell)Cells[i].method1();
强制转换应用于表达式
单元格[i].method1()
,它显然不起作用,因为
单元格[i]
仍然返回一个
单元格

如果您想保留一个额外的变量,请写入:

((BorderCell)Cells[i]).method1();
当你写作时

(BorderCell)Cells[i].method1();
强制转换应用于表达式
单元格[i].method1()
,它显然不起作用,因为
单元格[i]
仍然返回一个
单元格

如果您想保留一个额外的变量,请写入:

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

因为您在数组中放置了两种类型的单元格(BorderCell和BoardCell)。我建议在铸造之前先检查类型

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

因为您在数组中放置了两种类型的单元格(BorderCell和BoardCell)。我建议在铸造之前先检查类型

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

乔恩今天(和往常一样)扣动扳机很快!乔恩今天(和往常一样)扣动扳机很快!我想在这里回顾一下你的设计——必须回溯到派生类是一种糟糕的设计味道——如果你将它们保存在与基类型相同的集合中,我希望它们是真正多态的(Liskov原理)。Herbie博士:我愿意接受建议,查看此线程:我会在这里查看您的设计--必须强制转换为派生类是一种糟糕的设计气味--如果您将它们保存在与基类型相同的集合中,我希望它们是真正多态的(Liskov原则)。Herbie博士:我愿意接受建议,查看此线程:这取决于。如果代码知道应该在哪里有BorderCells,那么我们确信如果类型错误,表明存在bug,那么强制转换是正确的方法。确实,业务逻辑坚持认为,如果一个单元格位于特定的loaction中,那么它应该具有正确的类型。看:那要看情况。如果代码知道应该在哪里有BorderCells,那么我们确信如果类型错误,表明存在bug,那么强制转换是正确的方法。确实,业务逻辑坚持认为,如果一个单元格位于特定的loaction中,那么它应该具有正确的类型。见: