2012-02-10 6 views
4

誰かがこれを文字通り書くことができるので、キャスティングの実行方法を理解できますか?括弧の量は私を混乱させる。C#マルチキャスティングの例

(Dictionary<String, String>)((Object[])e.Result)[1];

だけで非常に有用ではありませんでした(私は間違ったことを探してる可能性手段)を検索する簡単なキャストの例を見つけることができました。あなたはキャストが右のそれが適用されるときに影響を与えるルールにオブジェクトに適用されることを覚えておく必要がある操作の順序を理解するために

答えて

10

まず辞書に(私の例では、1キャストで)、e.Resultタイプの配列にキャストされる鋳造オブジェクト[]の最初の要素をオンObject

(Object[])e.Result 

そして、そのアレイ、[1]のインデックス1の項目は、種類の辞書にキャストさ<string, string>

(Dictionary<String, String>)((Object[])e.Result)[1]; 

それが役に立った。

2
object[] cast1result = (object[]) e.Result; 
object dictionaryElement = cast1result[1]; 
Dictionary<string, string> cast2result = (Dictionary<string, string>) dictionaryElement; 
4

は、MSDNのOperator precedence and associativity

(Dictionary<String, String>)((Object[])e.Result)[1]; 
に依存します[]「一次式」CAにある -

Object[] cast1 = (Object[]) e.Result; 

キャスト動作がインデクサよりも低い優先度である「単項演算子」カテゴリーに分類されるになりテゴリー。

元の行 - indexer - []が最初の優先度として左のオブジェクトに直ちに適用されるため、キャスト:((Object [])e.Result)の周りに()が必要です。 around()がなければ、キャストはインデクサーの後に適用され、e.Resultは型オブジェクトの(おそらく?)なので、コンパイル時に失敗します。 ()の行がないと、次のようになります。

(Object[])e.Result[1] 

これは無効です。

((Object[])e.Result)[1] 

はe.Resultが最初のオブジェクト[]を入力するために鋳造され、その後、インデクサは、最初の要素にアクセスするために使用されることを保証します。

第二キャスト

Dictionary<String, String> cast2 = (Dictionary<String, String>) cast1[1]; 
4
Object[] cast1 = (Object[])e.Result; 
Object secondElement = cast1 [1]; 
Dictionary<String, String> cast2 = (Dictionary<String, String>)secondElement;