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

时间:2015-01-07 21:06:37

标签: c# compact-framework windows-ce extension-methods generic-type-argument

此代码改编自答案here,适用于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应用程序中的相同代码无法使用&#34; 编译方法的类型参数&System; Linin.Enumerable.Select (System.Collections.Generic.IEnumerable,System.Func)&#39;无法从使用中推断出来。尝试明确指定类型参数。&#34;

这条线失败了:

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

为什么相同的代码在一个案例中起作用而在另一个案例中起作用;是因为顽固的代码Windows CE-ness和/或因为它是.NET 3.5而不是较新的4.5.1?

如果这些限制中的一个或两个是问题,是否有解决方法,或者它是否回到编码板&#34;情况?

1 个答案:

答案 0 :(得分:4)

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

两个简单的选择:

  • 改为使用lambda表达式:

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

    .Select<XElement, SiteQuery>(GetSiteQueryForXMLElement);
    

要么工作正常。