在vs2008的msdn的C#编程指南里,其中在数组这一节介绍了隐式类型(ms-help://MS.MSDNQTR.v90.chs/dv_csref/html/e05be95c-6732-403d-ae42-b35f057cbbea.htm)。
这页的下方有这个一小节:
对象初始值设定项中的隐式类型的数组
创建包含数组的匿名类型时,必须在该类型的对象初始值设定项中对数组进行隐式类型化。在下面的示例中,contacts 是一个隐式类型的匿名类型数组,其中每个匿名类型都包含一个名为 PhoneNumbers 的数组。请注意,对象初始值设定项内部未使用 var 关键字。
 
var contacts = new[] 
{
    new {
            Name = " Eugene Zabokritski",
            PhoneNumbers = new[] { "206-555-0108", "425-555-0001" }
        },
    new {
            Name = " Hanying Feng",
            PhoneNumbers = new[] { "650-555-0199" }
        }
};
它里面出现了一个“匿名类型”,请问匿名类型和隐式类型是一个意思吗?
我始终没有弄明白这里的contacts对象到底是什么意思,如果不使用隐式类型,这个contacts该如何定义?

解决方案 »

  1.   

    不是。
    隐式类型,它仍然有确定的类型名称。
    比如:
    var s = "string";
    vas s = new String("abc");
    这是隐式类型,通过后面的代码(一个是常量,一个是new操作符)分析推测出确定的类型名称。匿名类型是这样的:
    var s = new {property1="abc",propoerty2=13};
    这样的语句:通过后面的代码,你分析不出一个确定的类型。通过匿名类型的技术,编译器生成一个假定的类型比如:
    public class Anonymous12341324
    {
       public string property1{get;set;}
       public int property2{get;set;}
    }
    由于匿名类型除了编译器外没有确定的类型名称,所以你必须配合隐式类型技术来实现,由var来动态的确定类型名称。
      

  2.   

    补充一下:
    结合上面我说的一句:隐式类型,它仍然有确定的类型名称。
    即使是var应用于匿名类型时,它仍然是有确定的类型名称的。只是这个名称只能由编译器提供给它,并且在编译时才生成。对于你上面的第二个问题,由于它是隐匿类型和匿名类型的结合,所以你是无法手工给出确定的类型名称的。var contacts = new[] 
    {
        new {
                Name = " Eugene Zabokritski",
                PhoneNumbers = new[] { "206-555-0108", "425-555-0001" }
            },
        new {
                Name = " Hanying Feng",
                PhoneNumbers = new[] { "650-555-0199" }
            }
    };对于这段代码,首先由编译器给出  new {
                Name = " Eugene Zabokritski",
                PhoneNumbers = new[] { "206-555-0108", "425-555-0001" }
            }这个的类型,可能是任意合法的类型名称,比如:XXXX;然后由new[] 得到相应的数组类型:XXXX[]这些无法在手工提供。
      

  3.   

    给你个链接
    http://www.cnblogs.com/artech/archive/2007/07/15/818980.html