繁体   English   中英

GroupCollection 上无法访问的可枚举扩展方法

[英]Enumerable extension methods inaccessible on GroupCollection

根据文档GroupCollection Class 实现了通用的IEnumerable接口。 它的扩展方法甚至列在该页面的下面。 然而,我得到

编译错误(第 16 行,第 4 列):“GroupCollection”不包含“Skip”的定义,并且找不到接受“GroupCollection”类型的第一个参数的可访问扩展方法“Skip”(您是否缺少 using 指令或装配参考?)

对于以下代码:

using System.Linq;
var currency = "HUF";
var origin = "Modlin";
var changes = 3;
System.Console.WriteLine(
    new[] {
        $"Cost: 50 {currency}",
        $"Departure airport: {origin}",
        $"Number of changes: {changes}"
    }[
        System.Text.RegularExpressions.Regex.Matches(
            "variable elem: blablaoriginbleble",
            "(currency)|(origin)|(changes)"
        )[0]
        .Groups
        .Skip(1)
        .Select((m, i) => (m, i))
        .First(p => p.Item1.Success)
        .Item2
    ]);

如果我用((System.Collections.Generic.IEnumerable<System.Text.RegularExpressions.Group>))包围 L11-15,错误就会消失。 为什么有必要?

更奇怪的是,省略[0].Groups (在语义上不等同,只是为了实验)也不会导致错误。 在这种情况下,扩展方法SkipSelectFirst在 MatchCollection 的实例上MatchCollection 它也实现了IEnumerable ,并且似乎行为应该是类似的。

编辑2:

我刚刚在 .NET 6 中测试了您的代码,并得到了相同的错误消息。 我变了:

.Skip(1)

至:

.Skip<System.Text.RegularExpressions.Group>(1)

它奏效了。 我认为问题在于,因为GroupCollection为两种特定类型TGroupKeyValuePair<string,Group>> )实现了两次IEnumerable<T> ,所以无法从使用中推断出该类型。 这意味着您需要在调用Skip时指定泛型类型参数,以便它知道要使用哪个实现。 这几乎就像您在对该问题的评论中所推测的那样。

编辑:

我将在下面留下我的原始答案,但是考虑到您的代码,您似乎正在使用顶级语句,因此这意味着您正在使用 .NET 6。我想我们会在您回复时看到。 如果你是那么我不确定原因是什么。

原来的:

该文档适用于 .NET 6。我猜您使用的是早期版本。 您应该在该页面的左上角 select 您的 .NET 版本,我希望您会发现,在该版本中, GroupCollection实现的接口要少得多。 例如,它仅在 .NET Framework 4.8 中实现了ICollection 您可以做的是调用Cast<T>来获取IEnumerable<T>然后访问该接口的所有扩展方法:

using System.Linq;
using System.Text.RegularExpressions;

var currency = "HUF";
var origin = "Modlin";
var changes = 3;

System.Console.WriteLine(
    new[] {
        $"Cost: 50 {currency}",
        $"Departure airport: {origin}",
        $"Number of changes: {changes}"
    }[
        Regex.Matches(
            "variable elem: blablaoriginbleble",
            "(currency)|(origin)|(changes)"
        )[0]
        .Groups
        .Cast<Group>()
        .Skip(1)
        .Select((m, i) => (m, i))
        .First(p => p.Item1.Success)
        .Item2
    ]);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM