为什么不能推断出类型参数,我该如何明确指定它们?
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);
两者都应该可以正常工作。
此代码改编自
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);
两者都应该可以正常工作。