簡體   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