2012-11-09 17 views
9
private Vector2 ResolveCollision(ICollidable moving, ICollidable stationary) 
{ 
    if (moving.Bounds.Intersects(stationary.Bounds)) 
    { 
     if (moving is Player) 
     { 
      (Player)moving.Color = Color.Red; 
     } 
    } 
    // ... 
} 

私はクラスPlayerがあり、ICollidableを実装しています。デバッグの目的のために、私はちょうどICollidablesの束をこのメソッドに渡そうとしており、それがプレイヤーのときには特別なことをしています。しかし、私がICollidablePlayerにキャストしようとすると、ICollidableColorというプロパティがないというエラーが表示されます。インターフェイスからクラスへのキャストに失敗したのはなぜですか?

このようにキャストできないのですか、何か間違っていますか?

+3

念を間違っ: '((プレーヤー)の移動).Color = ...'あなたが言うべき – Davio

+1

((プレーヤー)の移動).Color = Color.Red色がPlayerの属性である場合 – wxyz

+1

私の新しい問題は、どの答えを受け入れるかを決めることです。私は遅いためにこのサイトを決して失敗することはできません... – ssb

答えて

16

私はisの代わりにasを使用することをお勧めしたい:

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

利点は、あなたが一度だけ型チェックを行うことです。


(他の回答で述べたように)あなたのコードが動作しない理由を具体的な理由は、operator precedenceです。 .演算子は、主演算子であり、キャスト演算子よりも優先順位が高く、単項演算子です。他の回答で示唆したように、括弧を追加

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

は、この問題を解決するが、as代わりのisを使用するように変更し、問題が完全に離れて行かせる:あなたのコードは次のように解釈されます。

9

ColorPlayerの構文は、movingではありません。

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

また、asは少し好きです。それが失敗した場合、結果はnullです:

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

'is'そして' cast'は 'as'と実質的に同じです。チェック。いずれの場合も、例外はスローされません。 – Servy

2

追加のブラケットを追加する必要があります

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

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

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

そうでなければ、Playermoving.Colorをキャストしようとしています。あなたが1つのブラケットを忘れてしまった

2

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

変更

をまたキャストするas operatorを使用することができます。

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

これは機能していないわけではありません。「やや間違っている」という構文です。

これを試してみてください。括弧の

((Player) moving).Color = Color.Red; 
関連する問題