该代码段是根据其前序和中序表示重建二叉树。
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 你会得到 p>
error CS0314: The type
T
cannot be used as type parameterT
in the generic type or method ... There is no boxing conversion or type parameter conversion fromT
toSystem.IEquatable<T>
.
而 7.3 提供的功能则少得多
error CS1503: Argument 1: cannot convert from
FirstParamType
toSecondParamType
.
这不是特定于 .NET Core 或 ReadOnlySpan
,它可以用任何通用类进行复制。它可能是 fixed in the next release (免责声明:我没有检查修复是否真的适用,但它似乎正好解决了这个问题)。
关于c# - 为什么 C# (.NET Core 3) 不能为 MemoryExtensions.IndexOf 选择正确的重载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57371532/