What C# feature allows the use of an “object literal” type notation?
我来自于javascript,我知道
我知道这里有两个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} || }); //<------------------------------------------------------------------|| |
它是一个功能集合初始值设定项。与对象初始值设定项类似,它只能用作对象初始化表达式的一部分,但基本上,它调用
1 |
更多信息请参见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); |
编译器认识到它实现了
请参阅:http://msdn.microsoft.com/en-us/library/bb531208.aspx