我来自JavaScript,我知道{ }
是一个对象文字,不需要new Object
调用;我想知道{"id",id}, {"saveChangesError",true}
部分中C#是否与它相同。
我知道这里有两个C#功能,请向我解释一下它们是什么?
new RouteValueDictionary()
{ //<------------------------------[A: what C# feature is this?] -------||
{"id",id}, //<------------------[B: what C# feature is this also?] ||
{"saveChangesError",true} ||
}); //<------------------------------------------------------------------||
答案 0 :(得分:8)
这是一个功能 - collection initializers。与对象初始化器一样,它只能用作对象初始化表达式的一部分,但基本上它使用任何参数调用Add
- 使用大括号指定多个参数,或者一次使用单个参数而不使用额外的大括号,例如
var list = new List<int> { 1, 2, 3 };
有关详细信息,请参阅C#4规范的7.6.10.3节。
请注意,编译器需要两种类型的东西才能用于集合初始值设定项:
IEnumerable
,尽管编译器不会生成对GetEnumerator
的任何调用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();
}
}
答案 1 :(得分:7)
那是集合初始化语法。这样:
RouteValueDictionary d = new RouteValueDictionary()
{ //<-- A: what C# feature is this?
{"id",id}, //<-- B: what C# feature is this also?
{"saveChangesError",true}
});
基本上等同于:
RouteValueDictionary d = new RouteValueDictionary();
d.Add("id", id);
d.Add("saveChangesError", true);
编译器认识到它实现IEnumerable
并具有适当的Add
方法并使用它。
答案 2 :(得分:0)
请看Annonymous Types 它们允许您执行以下操作:
var v = new { Amount = 108, Message = "Hello" };