为什么可以';t我将LINQ与WorkItemCollection一起使用

本文关键字:LINQ WorkItemCollection 一起 我将 为什么 | 更新日期: 2023-09-27 17:57:47

我正在使用TFS的COM接口。(TeamFoundationServer.ExtendedClient v14.95.3)。我正在尝试使用LINQ来迭代各种集合。例如,此功能效果良好:

    public static IEnumerable<string> GetTitles(WorkItemCollection workItemList)
    {
        return from WorkItem item in workItemList select item.Fields["Title"].Value.ToString();
    }

然而,当我尝试更改为使用方法语法时,它失败了:

    public static IEnumerable<string> GetTitles2(WorkItemCollection workItemList)
    {
        return workItemList.Select(item => item.Fields["Title"].Value.ToString());
    }

出现错误"'WorkItemCollection'不包含'Select'的定义…"

我的文件中有using System.Linq;。我指的是System.Core.dllWorkItemCollection确实实现了IEnumerable。那么,为什么这不起作用呢?

为什么可以';t我将LINQ与WorkItemCollection一起使用

WorkItemCollection仅实现IEnumerable,而不实现IEnumerable<WorkItem>。LINQ扩展仅为IEnumerable<T>声明,而不为非通用IEnumerable声明。

您可以使用OfType<T>():

public static IEnumerable<string> GetTitles2(WorkItemCollection workItemList)
{
    return workItemList.OfType<WorkItem>()
                       .Select(item => item.Fields["Title"].Value.ToString());
}

您也可以使用Cast<T>来代替OfType<T>。但是,如果序列中有WorkItem以外的东西(在这种情况下可能从来不是这样),Cast<T>将抛出InvalidCastException,而OfType<T>将忽略该元素。

WorkItemCollection实现IEnumerable,而不是IEnumerable<T>。后者是通用接口,是LINQ的基础。

您可以使用Cast<T>扩展方法从一个转换到另一个,但是:

workItemList.Cast<WorkItem>.Select(item => ...