关于asp.net mvc:什么C#功能允许使用“对象文字”类型表示法?

What C# feature allows the use of an “object literal” type notation?

我来自于javascript,我知道{ }是一个对象文本,不需要调用new Object;我想知道在{"id",id}, {"saveChangesError",true}部分中,它是否与c相同。

我知道这里有两个C特性,想跟我解释一下它们是什么吗?

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


它是一个功能集合初始值设定项。与对象初始值设定项类似,它只能用作对象初始化表达式的一部分,但基本上,它调用Add,使用任何存在的参数-使用大括号指定多个参数,或一次使用单个参数而不使用大括号,例如。

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

更多信息请参见C_4规范第7.6.10.3节。

请注意,编译器需要两种类型的东西才能用于集合初始值设定项:

  • 它必须实现IEnumerable,尽管编译器不生成对GetEnumerator的任何调用。
  • 它必须对Add方法具有适当的重载

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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();
    }
}


这是集合初始化语法。这是:

2

基本上等同于:

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

编译器认识到它实现了IEnumerable的事实,并有一个适当的Add方法并使用它。

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