該代碼片段是根據其前序和中序表示重建二叉樹。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
,它可以使用任何泛型類進行重現。
- 1 回答
- 0 關注
- 155 瀏覽
添加回答
舉報
0/150
提交
取消