为啥 .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&lt;TFirst,TSecond,TResult&gt; 一个指定如何合并两个序列中的元素的函数。”

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 在 Ruby 中没有长度属性?

为啥有些 Enumerable 可以在 foreach 中更改,而有些则不能?

为啥 Enumerable 不继承自 IEnumerable<T>

为啥重复 Enumerable 到 Observable 转换块

为啥 Enumerable.Range 实现 IDisposable?

为啥 Enumerable 中的方法返回 Enumerator?