为什么在迭代PropertyDescriptorCollection时var的行为会有所不同?

时间:2014-06-01 19:41:34

标签: c# var

在下面的代码中,在foreach循环中使用var会破坏代码。那是为什么?

using System;
using System.ComponentModel;

namespace ConsoleApplication1
{
    public class Person
    {
        public string Name { get; set; }
        public int Age { get; set; }
        public Guid Ssn { get; set; }
    }

    internal class Program
    {
        private static void Main(string[] args)
        {
            var foo = new Person {Name = "Foo", Age = 99, Ssn = Guid.NewGuid()};

            PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(foo);

            foreach (PropertyDescriptor property in properties)
            {
                Console.WriteLine(property.Name);//Works
            }

            //foreach (var property in properties)
            //{
            //    Console.WriteLine(property.Name);//Does not work
            //}
        }
    }
}

2 个答案:

答案 0 :(得分:2)

PropertyDescriptorCollection是一个旧类,它是在通用IEnumerable<T>不存在的时候设计的。因此,它只实现IEnumerable,这意味着编译器不知道所包含对象的类型,var解析为objectPropertyDescriptorCollection确实提供了一个自定义强类型索引器,但该索引器从未用于foreach循环。

答案 1 :(得分:1)

PropertyDescriptorCollection doenst实现IEnumerable&lt; T&gt;, 它只实现IEnumerable。这就是为什么var默认为object(检查var关键字鼠标悬停时的工具提示)。

您也可以轻松地写下:

 foreach (Foo foo in properties)
 {
 }

这将导致类似的错误(InvalidCastException)。