我有一个叫做的课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)
为什么即使我使用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)