为什么不能推断出类型参数,我该如何明确指定它们?

Why can the type arguments not be inferred, and how can I specify them explicitly?

此代码改编自 的答案,适用于 Visual Studio 2013 年的 .NET 4.5.1 应用程序:

private void button42_Click(object sender, EventArgs e)
{
    List<SiteQuery> sitequeries = GetListOfSiteQueries();
    foreach (SiteQuery sitequery in sitequeries)
    {
        // TODO: Insert into table
    }
}

private List<SiteQuery> GetListOfSiteQueries()
{
    ArrayList arrList = 
FetchSiteQuery("http://localhost:21608/api/sitequery/getall/dbill/ppus/42");
    String omnivore = "<SiteQueries>";
    foreach (String s in arrList)
    {
        omnivore += s;
    }
    omnivore += "</SiteQueries>";
    String unwantedPreamble = "<ArrayOfSiteQuery xmlns:i=\"http://www.w3.org/2001/XMLSchema-
instance\" xmlns=\"http://schemas.datacontract.org/2004/07/CStore.DomainModels.HHS\">";
    omnivore = omnivore.Replace(unwantedPreamble, String.Empty);
    omnivore = omnivore.Replace("</ArrayOfSiteQuery>", String.Empty);
    XDocument xmlDoc = XDocument.Parse(omnivore);
    List<SiteQuery> sitequeries = 
xmlDoc.Descendants("SiteQuery").Select(GetSiteQueryForXMLElement).ToList();
    return sitequeries;
}

private static SiteQuery GetSiteQueryForXMLElement(XElement sitequery)
{
    return new SiteQuery
    {
        Id = sitequery.Element("Id").Value,
        . . .

但是,.NET 3.5 中的相同代码,VS 2008 中的 Compact Framework/Windows CE 应用程序无法编译,“无法推断方法 'System.Linq.Enumerable.Select(System.Collections.Generic.IEnumerable, System.Func)' 的类型参数从用法。尝试明确指定类型参数。"

这条线失败了:

List<SiteQuery> sitequeries = xmlDoc.Descendants("SiteQuery").Select(GetSiteQueryForXMLElement).ToList();

为什么相同的代码在一种情况下有效,而在另一种情况下却无效;是因为顽固的代码 Windows CE-ness and/or 因为它是 .NET 3.5 而不是更新的 4.5.1?

如果这些限制中的一个或两个 is/are 问题,是否有解决方法,或者是 "back to the coding board" 情况?

VS2010 (IIRC) 中的类型推断发生了变化 - 基本上,编译器变得更强大了。这不是 .NET 本身发生变化的问题。

两个简单的选项:

  • 改用 lambda 表达式:

    .Select(x => GetSiteQueryForXMLElement(x))
    
  • 使用方法组转换指定类型参数:

    .Select<XElement, SiteQuery>(GetSiteQueryForXMLElement);
    

两者都应该可以正常工作。