当证明它是基类时,为什么我必须转换一个继承的类?

use*_*370 0 c# casting

我有一个叫做的课BonusCell.它继承了这个GameEntity类.

public class BonusCell : GameEntity
{
   public void GiveStats()
   {

   }
}
Run Code Online (Sandbox Code Playgroud)

我有一个叫做的课 Cell

public Cell
{
    public GameEntity gameEntity;
}
Run Code Online (Sandbox Code Playgroud)

我有一个游戏网格,其中包含2维数组Cell.

public class Board
{
    public Cell[,] grid;
}
Run Code Online (Sandbox Code Playgroud)

BonusCell即使我使用if is声明来验证它是BonusCell什么,为什么我必须施放?我明白这board.grid[x,y].gameEntity是一种类型GameEntity,但如果这是真的,它is BonusCell怎么也可以是真的呢?

if (board.grid[x, y].gameEntity is BonusCell)
{
     BonusCell bonusCell = (BonusCell)board.grid[x, y].gameEntity;
     bonusCell.GiveStats();
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 5

为什么即使我使用if is语句来验证它是BonusCell,我还是必须转换BonusCell?

因为is运算符不会更改表达式的编译时类型board.grid[x, y].gameEntity.(在这种情况下,我猜不同的线程甚至可能会改变board.grid[x, y].gameEntity评估之间的值,使其真正不安全.无论哪种方式,编译器都不会尝试从if条件中推断出任何东西.如果语言规范要求这样做,它会使它变得更加复杂.)

另一种方法是使用as和一个额外的局部变量:

BonusCell bonusCell = board.grid[x, y].gameEntity as BonusCell;
if (bonusCell != null) 
{
    bonusCell.GiveStats();
}
Run Code Online (Sandbox Code Playgroud)