public static class SwapExt
{
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void Swap<T>(ref T? left, ref T? right) => (left, right) = (right, left);
[Pure]
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static (T? right, T? left) Swap<T>(this T? left, T? right) => (right, left);
[Pure]
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static (T? right, T? left) Swap<T>((T? left, T? right) tuple) => (tuple.right, tuple.left);
}
Pay close attention to which method you think is being used. (The refs versus the tuples.)