9
private Vector2 ResolveCollision(ICollidable moving, ICollidable stationary)
{
    if (moving.Bounds.Intersects(stationary.Bounds))
    {
        if (moving is Player)
        {
            (Player)moving.Color = Color.Red;
        }
    }
    // ...
}

I have a class Player that implements ICollidable. For debugging purposes I'm just trying to pass a bunch of ICollidables to this method and do some special stuff when it's the player. However when I try to do the cast to Player of the ICollidable I get an error telling me that ICollidable doesn't have a Color property.

Am I not able to make a cast this way or am I doing something wrong?

4

6 に答える 6

16

asの代わりに使用することをお勧めしますis

Player player = moving as Player;
if (player != null)
{
    player.Color = Color.Red;
}

利点は、型チェックを 1 回だけ行うことです。


コードが機能しない特定の理由 (他の回答で述べたように) は、operator precedenceが原因です。この.演算子は、単項演算子であるキャスト演算子よりも優先順位が高い演算子です。コードは次のように解釈されます。

(Player)(moving.Color) = Color.Red;

他の回答で提案されているように括弧を追加すると、この問題は解決しますが、as代わりに使用するように変更するisと、問題は完全になくなります。

于 2012-11-09T14:12:27.687 に答える
9

Your syntax is casting Color to Player, not moving.

((Player)mover).Color = Color.Red;
//^do the cast  ^access the property from the result of the cast

Also, as tends to be a little nicer. If it fails, the result is null:

var player = moving as Player;
if(player != null)
{
    player.Color = Color.Red;
}
于 2012-11-09T14:12:25.063 に答える
3

機能していないのではなく、構文が「やや」間違っているのです。

これを試して:

((Player) moving).Color = Color.Red;
于 2012-11-09T14:13:44.510 に答える
2

さらにブラケットを追加する必要があります。

((Player)moving).Color = Color.Red;
于 2012-11-09T14:12:27.320 に答える
2

キャストと変数を括弧で囲む必要があります。

((Player)moving).Color = Color.Red;

それ以外の場合は、にキャストしようとしていmoving.ColorますPlayer

于 2012-11-09T14:13:01.140 に答える
2

ブラケットを 1 つ忘れました。

変化する

 (Player)moving.Color = Color.Red;

 ((Player)moving).Color = Color.Red;

as演算子を使用してキャストすることもできます。

Player p = moving as Player;
if (p != null)
{
    p.Color = Color.Red;
}
于 2012-11-09T14:13:15.633 に答える