为了账号安全,请及时绑定邮箱和手机立即绑定

为什么 C# (.NET Core 3) 无法为 MemoryExtensions.IndexOf

为什么 C# (.NET Core 3) 无法为 MemoryExtensions.IndexOf

C#
Cats萌萌 2023-08-13 15:38:55
该代码片段是根据其前序和中序表示重建二叉树。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>;
查看完整描述

1 回答

?
慕少森

TA贡献2019条经验 获得超9个赞

您的方法没有任何限制,因此实际上没有适用where T : IEquatable<T>的重载。IndexOf添加该内容,问题就消失了。

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

错误 CS0314: 该类型T不能用作T泛型类型或方法中的类型参数...没有装箱转换或从T到 的 类型参数转换System.IEquatable<T>

而 7.3 给出的用处要小得多

错误 CS1503:参数 1:无法从 转换FirstParamType为 SecondParamType

这不是特定于 .NET Core 或 .NET Core 的ReadOnlySpan,它可以使用任何泛型类进行重现。


查看完整回答
反对 回复 2023-08-13
  • 1 回答
  • 0 关注
  • 114 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信