c# - 为什么 C# (.NET Core 3) 不能为 MemoryExtensions.IndexOf 选择正确的重载?

标签 c# .net-core

该代码段是根据其前序和中序表示重建二叉树。

static public BinaryTreeNode<T> BuildFromPreAndInOrder<T>(ReadOnlySpan<T> preOrder, ReadOnlySpan<T> inOrder)
{
    if (preOrder == null || preOrder.IsEmpty || inOrder == null || inOrder.IsEmpty) { return null; }
    var val = preOrder[0];
    BinaryTreeNode<T> root = new BinaryTreeNode<T>(val);
    // this doesn't make sense
    var splitPoint = MemoryExtensions.IndexOf<T>(inOrder, val);
    if (splitPoint == -1) {
        return null;
    }
    preOrder = preOrder.Slice(1);
    var leftPart = inOrder.Slice(0, splitPoint);
    var rightPart = inOrder.Slice(splitPoint + 1);
    root.left = BuildFromPreAndInOrder(preOrder, leftPart);
    root.right = BuildFromPreAndInOrder(preOrder, rightPart);
    return root;
}

节点很简单,所以我附上了部分。

class BinaryTreeNode<T> : IEquatable<BinaryTreeNode<T>>
{
    public T key;
    public BinaryTreeNode<T> left;
    public BinaryTreeNode<T> right;
}

我尝试在 .NET Core 3 Preview 7 SDK 上编译它,但编译器提示 error CS1503: Argument 2: cannot convert from 'T' to 'System.ReadOnlySpan<T>' .为什么编译器不能选择正确的方法? 检查工具向我显示了一个应该能够匹配这个的签名。

public static int IndexOf<T>([NullableAttribute(new[] { 0, 1 })] this ReadOnlySpan<T> span, [NullableAttribute(1)] T value) where T : IEquatable<T>;

最佳答案

没有where T : IEquatable<T>对你的方法的约束,所以没有重载 IndexOf实际上是适用的。添加它,问题就消失了。

实际错误仍然具有误导性/错误性。这是罗斯林的变化/回归。从 C# 7.2 到 7.3,可以观察到错误消息之间的变化;对于 7.2 你会得到

error CS0314: The type T cannot be used as type parameter T in the generic type or method ... There is no boxing conversion or type parameter conversion from T to System.IEquatable<T>.

而 7.3 提供的功能则少得多

error CS1503: Argument 1: cannot convert from FirstParamType to SecondParamType.

这不是特定于 .NET Core 或 ReadOnlySpan ,它可以用任何通用类进行复制。它可能是 fixed in the next release (免责声明:我没有检查修复是否真的适用,但它似乎正好解决了这个问题)。

关于c# - 为什么 C# (.NET Core 3) 不能为 MemoryExtensions.IndexOf 选择正确的重载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57371532/

相关文章:

c# - 私有(private) WPF 依赖属性

c# - 在 Quartz.net 中删除作业的触发器

c# - 来自 QueryString 的一行 bool

mongodb - 如何将Bson ObjectId添加到JObject

.net-core - .NET Core 2.0 Web API - 如何在 Swagger 中添加自定义 header 参数

.net-core - .Net Core 3.1 在 Swagger UI 上删除架构

c# - 为什么编译器无法在 Regex.Matches 的 foreach 中推断出正确的类型?

c# - WPF - 未找到 src 类型

c# - 在长时间运行的 Hangfire 进程中发送心跳

c# - .Net Core 3 Serilog 的依赖注入(inject)