ProcessThreadCollection

ProcessThreadCollection

这段代码可以正常工作:

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

最佳答案

ProcessThreadCollection的枚举器来自其枚举器为ReadOnlyCollectionBase而不是IEnumeratorIEnumerator<ProcessThread>

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

最好的解决方案是(正如我确定您知道的那样)简单地执行此操作:

foreach(ProcessThread pt in th)

10-07 15:54