在下面的代码中,在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
//}
}
}
}
答案 0 :(得分:2)
PropertyDescriptorCollection
是一个旧类,它是在通用IEnumerable<T>
不存在的时候设计的。因此,它只实现IEnumerable
,这意味着编译器不知道所包含对象的类型,var
解析为object
。 PropertyDescriptorCollection
确实提供了一个自定义强类型索引器,但该索引器从未用于foreach
循环。
答案 1 :(得分:1)
PropertyDescriptorCollection doenst实现IEnumerable&lt; T&gt;, 它只实现IEnumerable。这就是为什么var默认为object(检查var关键字鼠标悬停时的工具提示)。
您也可以轻松地写下:
foreach (Foo foo in properties)
{
}
这将导致类似的错误(InvalidCastException)。