为什么var推断类型X509Certificate2而不是X509Certificate2Collection循环中的对象?

时间:2013-03-23 00:50:26

标签: c# generics

有很多问题(1 2 3)关于varobject循环中选择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情况下的实际类型?

1 个答案:

答案 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