6

我来自 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}                                             ||
}); //<------------------------------------------------------------------||
4

3 回答 3

8

这是一个单一的功能 -集合初始化器。像对象初始化器一样,它只能用作对象初始化表达式的一部分,但基本上它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();
    }
}
于 2012-04-12T22:48:01.913 回答
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方法并使用它的事实。

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

于 2012-04-12T22:48:17.847 回答
1

请查看匿名类型 它们允许您执行以下操作:

var v = new { Amount = 108, Message = "Hello" };  
于 2021-03-08T04:18:35.230 回答