var关键字猜测VS 2013

时间:2014-11-25 19:09:22

标签: c# visual-studio var

此代码可以正常工作:

Process v = Process.GetProcessById(6752); // firefox 
Console.WriteLine(v);
ProcessThreadCollection th = v.Threads;
foreach (ProcessThread pt in th)
{
    var info = string.Format("-> Thread ID: {0}\tStart Time: {1}\tPriority: {2}",
        pt.Id, pt.StartTime.ToShortTimeString(), pt.PriorityLevel);
    Console.WriteLine(info);
}

但是不要这样做:

Process v = Process.GetProcessById(6752); // firefox 
Console.WriteLine(v);
ProcessThreadCollection th = v.Threads;
foreach (var pt in th)  // var instead of ProcessThread
{
    var info = string.Format("-> Thread ID: {0}\tStart Time: {1}\tPriority: {2}",
        pt.Id, pt.StartTime.ToShortTimeString(), pt.PriorityLevel);
    Console.WriteLine(info);
}
第二个

pt由编译器假定为object,当然不编译。

为什么编译器将ProcessThreadCollection的元素假定为object而不是ProcessThread

2 个答案:

答案 0 :(得分:9)

Process.ThreadsIEnumerable,而不是IEnumerable<ProcessThread>。第一个代码段中的代码是将IEnumerable中的每个对象投射到ProcessThread。您的第二个代码段中的代码根本不会转换代码,而是使用对象的实际类型,即object

答案 1 :(得分:4)

ProcessThreadCollection的调查员来自ReadOnlyCollectionBase,其调查员为IEnumerator而不是IEnumerator<ProcessThread>

GetEnumerator中的

ReadOnlyBaseCollection是一个虚方法,默认情况下返回this.InnerList.GetEnumerator() - InnerList是ArrayListProcessThreadCollection不会覆盖此方法,这就是您获取对象而不是ProcessThread的原因。

对此的最佳解决方案是(我确信你知道)只需这样做:

foreach(ProcessThread pt in th)