如何检查两个Span <T>是否相交?

Tra*_*uer 11 c#

考虑以下功能:

public static bool TryToDoStuff(ReadOnlySpan<byte> input, Span<byte> destination) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

这个函数返回它是否能在"做的东西" destination基础上input的内容.

我想检查内存区域是否"包裹" inputdestination相交,如果是,则抛出异常,因为这会破坏input数据.我怎么能这样做(没有反射或不安全的代码)?

我知道我可以编写一些xmldoc并警告用户参数不应该相交,但这是一个穷人的解决方案.

编辑:对于那些要求举例的人,Wazner的例子非常重要.

// On arrays
Span<byte> firstArray = new byte[10];
Span<byte> secondArray = new byte[10];
Intersects<byte>(firstArray.Slice(5, 5), firstArray.Slice(3, 5)); // Should throw
Intersects<byte>(firstArray.Slice(5, 5), secondArray.Slice(3, 5)); // Should not throw

// And on stackallocated memory
Span<byte> firstStack = stackalloc byte[10];
Span<byte> secondStack = stackalloc byte[10];
Intersects<byte>(firstStack.Slice(5, 5), firstStack.Slice(3, 5)); // Should throw
Intersects<byte>(firstStack.Slice(5, 5), secondStack.Slice(3, 5)); // Should not throw
Run Code Online (Sandbox Code Playgroud)

Tra*_*uer 2

我在 dotnet/corefx 存储库上创建了一个问题,其中一位贡献者发布了此链接:

https://learn.microsoft.com/en-us/dotnet/api/system.memoryextensions.overlaps?view=netcore-2.1

所以,是的,有一个优雅、简洁、安全且在框架内的解决方案来解决这个问题。