为啥 .NET Core 中 Enumerable.Zip() 的 2 参数重载但 .NET Standard 中没有? [关闭]
Posted
技术标签:
【中文标题】为啥 .NET Core 中 Enumerable.Zip() 的 2 参数重载但 .NET Standard 中没有? [关闭]【英文标题】:Why is the 2-argument overload of Enumerable.Zip() in .NET Core but not in .NET Standard? [closed]为什么 .NET Core 中 Enumerable.Zip() 的 2 参数重载但 .NET Standard 中没有? [关闭] 【发布时间】:2020-06-27 22:48:57 【问题描述】:我在类型库、.NET Core、C# 的 Visual Studio 中创建一个新项目,然后粘贴以下代码:
using System;
using System.Collections.Generic;
using System.Linq;
namespace MyLibrary
public class Class1
public void Method()
var numbers = new List<int> 1, 2, 3 ;
var chars = new List<char> 'a', 'b', 'c' ;
foreach (var (n, c) in Enumerable.Zip(numbers, chars))
Console.WriteLine($"n, c");
编译器毫无怨言地接受了这一点。
现在我创建一个类型类库、.NET Standard、C# 的新项目,然后粘贴相同的代码并更改命名空间。编译器现在给出这些错误:
1>[path]\Class1.cs(15,47,15,50): error CS7036: There is no argument given that corresponds to the required formal parameter 'resultSelector' of 'Enumerable.Zip<TFirst, TSecond, TResult>(IEnumerable<TFirst>, IEnumerable<TSecond>, Func<TFirst, TSecond, TResult>)'
1>[path]\Class1.cs(15,36,15,66): error CS1061: 'TResult' does not contain a definition for 'Deconstruct' and no accessible extension method 'Deconstruct' accepting a first argument of type 'TResult' could be found (are you missing a using directive or an assembly reference?)
1>[path]\Class1.cs(15,36,15,66): error CS8129: No suitable 'Deconstruct' instance or extension method was found for type 'TResult', with 2 out parameters and a void return type.
1>[path]\Class1.cs(15,27,15,28): error CS8130: Cannot infer the type of implicitly-typed deconstruction variable 'n'.
1>[path]\Class1.cs(15,30,15,31): error CS8130: Cannot infer the type of implicitly-typed deconstruction variable 'c'.
如果我在每个代码副本中对 Enumerable.Zip 调用“转到定义”,我会看到在 .NET Core 项目可访问的 Enumerable 中有两个 Zip() 重载,但在 Enumerable 可访问.NET Standard 项目只有一个。缺少 2 参数重载。 .NET Standard 版本还缺少少量其他方法:SkipLast()、TakeLast() 和 ToHashSet()。为什么在 .NET Standard 中省略了这些方法,尤其是 Zip() 的重载?
【问题讨论】:
也许它们存在于某个 github 项目中。 这个问题恐怕是题外话,因为这里的大多数人(我的意思是几乎每个人)都无法客观地回答同类问题”微软的相关团队在想什么时候……”,除非它偶然引起了相关开发团队某人的注意(并非闻所未闻,但通常不会提出这类问题)。因此,它本质上是在征求意见,了解为什么 std 和 core 之间存在差异 在我看来,如果没有客观原因导致它丢失,那么你可以回答那个效果,这就是一个答案。有时,“为什么 x 是这样”形式的问题的答案是“没有理由”;这并不意味着这个问题有问题,事情的方式是任意的这一事实是一种信息。我不同意这个问题是“就为什么存在差异征求意见”;为了让我这样做,我必须首先意识到差异是任意的,而我不是。 【参考方案1】:.NET Standard 是 .NET Framework 和 .NET Core 都支持的通用库。
Enumerable.Zip
在 .NET Framework 中只有一个重载,而实际上第二个重载是在 .NET Core 3.0 中才引入的。
.NET Framework 不再由 Microsoft 主动更新,因此有所不同。
【讨论】:
【参考方案2】:如果您希望它在类库、.NET Standard、C# 中工作,那么您将需要以下代码。您将需要定义结果选择器“Func<TFirst,TSecond,TResult>
一个指定如何合并两个序列中的元素的函数。”
var numbers = new List<int> 1, 2, 3 ;
var chars = new List<char> 'a', 'b', 'c' ;
foreach (var (n,c) in Enumerable.Zip(numbers, chars, (n, c) => (n, c)))
Console.WriteLine($"n, c");
【讨论】:
以上是关于为啥 .NET Core 中 Enumerable.Zip() 的 2 参数重载但 .NET Standard 中没有? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
为啥有些 Enumerable 可以在 foreach 中更改,而有些则不能?
为啥 Enumerable 不继承自 IEnumerable<T>
为啥重复 Enumerable 到 Observable 转换块