【问题标题】:Why can the type arguments not be inferred, and how can I specify them explicitly?为什么不能推断类型参数,如何明确指定它们?
【发布时间】:2015-01-07 21:06:36
【问题描述】:

此代码改编自答案 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 应用程序中的相同代码无法使用“方法 '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?

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

【问题讨论】:

  • 试试Select&lt;YourTypeHere&gt;(GetSiteQueryForXMLElements)
  • @EricJ.:您需要指定源 结果类型 - Select 上有两个类型参数。
  • 好点,我看到你的回答中反映了这一点 (+1)

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


【解决方案1】:

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

两个简单的选择:

  • 改用 lambda 表达式:

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

    .Select<XElement, SiteQuery>(GetSiteQueryForXMLElement);
    

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

【讨论】:

  • 如果我将 List 换成 IEnumerable,任何一个都可以,是的;谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-11
  • 1970-01-01
  • 1970-01-01
  • 2013-03-18
  • 2021-03-06
  • 1970-01-01
相关资源
最近更新 更多