关于为什么在循环中选择类型有很多问题(1 2 3 ) ,但这次不同。当我使用此代码片段循环 a时,令我惊讶的是,实际上选择了类型,而不是,尽管只实现了非泛型而不是!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 文章中看到继承层次结构,但它似乎没有实现IEnumerable<X509Certificate2>
。如果我在集合上使用 LINQ,我不会得到X509Certificate2
类型:
collection.Select(cert => cert.Subject); // Won't compile
那么编译器如何知道var
案例中的实际类型呢?