2012-04-12 4 views
6

私はJavaScriptから来ており、{ }はオブジェクトリテラルであり、new Objectコールを必要としないことがわかります。私はそれが{"id",id}, {"saveChangesError",true}部分のC#と同じであるかどうか疑問に思っています。"オブジェクトリテラル"型表記を使用できるC#機能は何ですか?

私はここに2つのC#の機能があることを知っています、彼らが何であるかについて私に説明してください。

new RouteValueDictionary() 
{ //<------------------------------[A: what C# feature is this?] -------|| 
    {"id",id}, //<------------------[B: what C# feature is this also?] || 
    {"saveChangesError",true}            || 
}); //<------------------------------------------------------------------|| 
+0

自動的にオブジェクトが作成された*後*いくつかの方法(特に 'Add')を呼び出すためのC#でちょうど特別な魔法です。 –

+0

答え:can *プロパティの初期化を*コレクションの初期化と混在させる*? (これは、「新しいFoo {Bar = Quz}」である可能性があるため、「外側」構造を説明するために存在するはずです) –

+0

@pst:いいえ、VB.NETでさえ、奇妙なことに... – Ryan

答えて

8

1つの機能 - collection initializersです。オブジェクト初期化子と同様に、オブジェクト初期化式の一部としてのみ使用できますが、基本的には、引数が何であれ、Addを呼び出します。複数の引数を指定するには中かっこを使用します。

var list = new List<int> { 1, 2, 3 }; 

詳細は、C#4仕様のセクション7.6.10.3を参照してください。コンパイラはそれをしなければならないGetEnumerator

  • への呼び出しを生成しませんが

    • それは、IEnumerableを実装する必要があります。コンパイラは、コレクション初期化子に使用するための型の2つのことが必要であることを

      注意例えばAdd方法

    ための適切なオーバーロードを有する:

    using System; 
    using System.Collections; 
    
    public class Test : IEnumerable 
    { 
        static void Main() 
        { 
         var t = new Test 
         { 
          "hello", 
          { 5, 10 }, 
          { "whoops", 10, 20 } 
         }; 
        } 
    
        public void Add(string x) 
        { 
         Console.WriteLine("Add({0})", x); 
        } 
    
        public void Add(int x, int y) 
        { 
         Console.WriteLine("Add({0}, {1})", x, y); 
        } 
    
        public void Add(string a, int x, int y) 
        { 
         Console.WriteLine("Add({0}, {1}, {2})", a, x, y); 
        } 
    
        IEnumerator IEnumerable.GetEnumerator()   
        { 
         throw new NotSupportedException(); 
        } 
    } 
    
  • +0

    http://msdn.microsoft.com/en-us/ library/bb531208.aspx – pm100

    +2

    少なくとも答えのMSDNドキュメントへのリンクを用意しましょう。 :) –

    +0

    @ダンジャー:ええ、私はそこに行っています:) –

    7

    これはコレクションの初期化構文です。この:

    RouteValueDictionary d = new RouteValueDictionary() 
    {        //<-- A: what C# feature is this? 
        {"id",id},     //<-- B: what C# feature is this also?  
        {"saveChangesError",true} 
    }); 
    

    は、この基本的に同等である:それはIEnumerableを実装し、適切なAdd方法を持っていて、それを使用することを

    RouteValueDictionary d = new RouteValueDictionary(); 
    d.Add("id", id); 
    d.Add("saveChangesError", true); 
    

    コンパイラは事実を認識しています。

    参照:http://msdn.microsoft.com/en-us/library/bb531208.aspx

    +4

    "辞書の初期化構文"は、C#*のように発音します*辞書には辞書知識があります。それはしません。 * IEnumerableを実装し、適切な 'Add'メソッドを持つ* any *型で動作します。 –

    +1

    @ JonSkeet:それが「KeyValuePair」であることをどのように認識していますか? – Ryan

    +3

    @minitech:そうではありません。これは 'Add(key、value)'メソッドがあることを認識します。私の答えはその例を見てください。実際には、変数は 'Add'呼び出しの後にのみ*割り当てられます - それはあなたの前に一時変数があるかのようです。 –

    関連する問題