2013-02-14 10 views
23

typeof(Object[][,]).NameObject[,][]typeof(Object [、] [])。Nameが "Object [] [、]"と等しいのはなぜですか? <code>typeof(Object[,][]).Name</code>評価

を与え、同様Object[][,]

を与えるコンマが理由もなく動いているように思えます。

何がありますか?

+0

私はカンマの位置を変更するルールを見つけましたが、なぜそれがそのように動作しているのかわかりません。コンマは配列の中心に反映されます。例えば; '' [] [] [] [] [] [] [] [] [] [] [] [ ] [、] [] '、' [] [] [] [] [] '結果として' [] [] [、] [] [] 'を返します。 –

+1

+1。ニースの質問! – ja72

+2

@SonerGönül:「[] [、] [,,] [,,,] [,,,,] 'を試してください。 –

答えて

19

不揃いと長方形の配列を混在させることは、狂気のためのレシピです。与えられた型記法が意味することについてのあなたの直感は、ほとんどいつも間違っています、または少なくとも、私のものです。

テーマに関する私の記事を読んで、それはあなたがここで何が起こっているか理解するのに役立つかどうかを確認:

基本的に

http://blogs.msdn.com/b/ericlippert/archive/2009/08/17/arrays-of-arrays.aspx

:C#と反射がそれぞれに、2つの異なる方法で混合ぼろぼろ/長方形配列を記譜彼ら自身の理由。

+0

+1、リンクからの最善の引用_ "実際に配列指定子を追加することで、その型の配列に要素型を作成するわけではありません。" _ – ja72

+0

@ ja72:C#で正しい。しかし、C#の規則に従わないReflectionでは、配列修飾子を真ん中にではなく、型名の最後に強く貼り付けます。 –

+0

答えてくれてありがとうEric。心配しないでください - 実際に私のコードでこのようなタイプは使用していません。私はリフレクションを使用して公開APIのフレンドリーリストを作成するツールを作成しています。このテストケースは警告音を鳴らしました。 – RobSiklos

3

このようなエキゾチックな配列を宣言したいかもしれないという目的を除いて、リフレクションが配列の名前を生成する方法は再帰的です:最初に配列の要素型の名前を生成し、適当な数のカンマで括弧をつけてください。

Object[,][]は、1Dアレイの2D配列です。 2D配列の要素タイプはObject[]なので、全体的な結果は"Object[]"+"[,]"です。ここで

は、アルゴリズムの動作方法の他の例である:それは限り:

typeof(Object[][,][,,][,,,][,,,,]).Name 

は、私は、実装の効率以外のその背後にある理由が表示されていない

Object[,,,,][,,,][,,][,][] 

です構文がC#と一致するかどうかは関係ありません。結局のところ、C#は.NETの世界で唯一の言語ではありません。

+1

;ここで奇妙なのは、 'object [、] []'は 'object []'の1次元配列でなければならないと思われるとき、 'object [、] []'は 'object []' 。 –