[英]Why does RegularExpressions.GroupCollection enumerable not work with Linq extension methods?
[英]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
(在語義上不等同,只是為了實驗)也不會導致錯誤。 在這種情況下,擴展方法Skip
、 Select
和First
在 MatchCollection 的實例上MatchCollection
。 它也實現了IEnumerable
,並且似乎行為應該是類似的。
編輯2:
我剛剛在 .NET 6 中測試了您的代碼,並得到了相同的錯誤消息。 我變了:
.Skip(1)
至:
.Skip<System.Text.RegularExpressions.Group>(1)
它奏效了。 我認為問題在於,因為GroupCollection
為兩種特定類型T
( Group
和KeyValuePair<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.