gpt4 book ai didi

c# - XElement.Elements().Select() 原因 尝试明确指定类型参数

转载 作者:行者123 更新时间:2023-11-30 22:25:22 25 4
gpt4 key购买 nike

我遇到了一个奇怪的问题,想知道是什么原因造成的。

我有以下 XML:

<categories>
<category Name="Generic" Id="0"></category>
<category Name="Development Applications" Id="2"></category>
<category Name="Standard Templates" Id="5"></category>
<category Name="Testing" Id="9" />
</categories>

和以下代码创建“类别”列表:

var doc = XDocument.Load("categories.xml");

var xElement = doc.Element("categories");
if (xElement == null) return;

var categories = xElement.Elements().Select(MapCategory).ToList();

哪里:

private static Category MapCategory(XElement element)
{
var xAttribute = element.Attribute("Name");
var attribute = element.Attribute("Id");
return attribute != null && xAttribute != null
? new Category(xAttribute.Value, attribute.Value)
: null;
}

在编译之前没有任何错误/警告等表明这是错误的,但是我在编译后收到以下消息但仍然没有红色下划线:

The type arguments for method 'System.Linq.Enumerable.Select<TSource,TResult>(System.Collections.Generic.IEnumerable, System.Func<TSource,TResult>)' cannot be inferred from the usage. Try specifying the type arguments explicitly.

现在,如果我将有问题的行更改为以下内容,一切都很好:

var categories = xElement.Elements().Select<XElement, Category>(MapCategory).ToList();

我本以为Select<XElement, Category>是多余的???ReSharper 也同意我的看法。

为了确保,我删除了 MapCategory 并将其替换为以下内容,但这次我得到了红色下划线和编译错误:

var categories2 = doc.Element("categories").Elements().Select(element =>
{ new Category(element.Attribute("Name").Value, element.Attribute("Id").Value); }).ToList();

让我更加困惑的是,我让另一位开发人员也尝试了代码,他根本没有遇到任何编译错误。

知道为什么会发生这种情况吗?

最佳答案

Just to add to my confusion, I had another developer also try the code out and he didn't get any compilation errors at all.

我的猜测是您使用的 C# 编译器版本与您的同事不同。

这不仅限于 LINQ to XML 或 Elements() 调用的使用。如果您有以下情况,我相信您会看到相同的行为:

private static string ConvertToString(int x) { ... }

...
IEnumerable<int> values = null; // We're only testing the compiler here...
IEnumerable<string> strings = values.Select(ConvertToString);

基本上,使用方法组转换的泛型方法调用的类型推断在 C# 4 编译器中得到了改进。 (我认为 C# 5 编译器可能也有所改进,但我记不清了。)显式指定类型参数的替代方法是使用 lambda 表达式:

...Elements().Select(x => MapCategory(x))...

关于c# - XElement.Elements().Select() 原因 尝试明确指定类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12361268/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com