为什么无法推断类型参数,以及如何显式指定它们

本文关键字:何显式 类型参数 为什么 | 更新日期: 2023-09-27 18:36:34

此代码改编自此处的答案,适用于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,
        . . .

但是,VS 2008 中的 .NET 3.5、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性和/或因为它是.NET 3.5而不是较新的4.5.1?

如果其中一个或两个限制是问题所在,是否有解决方法,或者是否是"回到编码板"的情况?

为什么无法推断类型参数,以及如何显式指定它们

VS2010 (IIRC) 中更改了类型推断 - 基本上编译器的功能稍微提高了一点。这不是 .NET 本身更改的问题。

两个简单的选项:

  • 请改用 lambda 表达式:

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

    .Select<XElement, SiteQuery>(GetSiteQueryForXMLElement);
    

两者都应该正常工作。