有很多问题(1 2 3)关于var
在object
循环中选择foreach
类型的原因,但是这次是不同的。当我使用此代码段循环浏览X509Certificate2Collection
时,var
实际上选择了X509Certificate2
类型而不是object
令我感到惊讶,尽管X509Certificate2Collection
只实现非通用IEnumerable
而不是IEnumerable<T>
!
X509Certificate2Collection collection = new X509Certificate2Collection();
foreach (var cert in collection)
{
Console.WriteLine(cert.Subject);
}
您可以在msdn article中看到继承层次结构,但它似乎没有实现IEnumerable<X509Certificate2>
。如果我在集合上使用LINQ,我不会得到X509Certificate2
类型:
collection.Select(cert => cert.Subject); // Won't compile
那么编译器如何知道var
情况下的实际类型?
答案 0 :(得分:3)
X509Certificate2Collection.getEnumerator()
返回X509Certificate2Enumerator
,其Current
属性类型为X509Certificate2
。
换句话说,c#不仅仅依赖于IEnumerable或IEnumerable&lt; T&gt;。它正在直接查看Current
属性。
http://msdn.microsoft.com/en-us/library/aa288257%28v=vs.71%29.aspx