为什么无法推断类型参数,以及如何显式指定它们
本文关键字:何显式 类型参数 为什么 | 更新日期: 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);
两者都应该正常工作。