2013-03-23 106 views
0

关于为什么varforeach循环中选取object类型有很多问题(123),但这一次不同。当我使用此代码片段循环访问X509Certificate2Collection时,令我感到惊讶的是,var实际上拾取了X509Certificate2类型,而不是object,尽管X509Certificate2Collection仅实现非泛型IEnumerable而不是IEnumerable<T>为什么var在X509Certificate2Collection循环中推断类型X509Certificate2而不是对象?

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情况下的实际类型?

回答

3

X509Certificate2Collection.getEnumerator()返回X509Certificate2Enumerator,其中Current类型为X509Certificate2

换句话说,c#不仅仅依靠IEnumerable或IEnumerable < T>。它正在直接查看该Current属性。

http://msdn.microsoft.com/en-us/library/aa288257%28v=vs.71%29.aspx

+0

你可能是对的。这可以解释它。谢谢! – 2013-03-23 01:01:35

+0

修改了链接到文档 – 2013-03-23 01:08:14

相关问题