我只是想交换指针中的地址。你知道,试一试。所以我得到了可怜的代码:
unsafe class Test
{
static void Main()
{
int a = 1; int b = 2;
int* x = &a, y = &b;
Console.WriteLine($"{*x} and {*y}");
Swap(out x, out y);
Console.WriteLine($"{*x} and {*y}");
}
static void Swap(out int* a, out int* b)
{
long x = (long)a;
long y = (long)b;
x ^= y ^= x ^= y;
a = (int*)x; b = (int*)y;
}
}
可怕的错误:
Error CS0269 Use of unassigned out parameter 'a' ConsoleApp1
Error CS0269 Use of unassigned out parameter 'b' ConsoleApp1
为什么?我不能使用关键字out
的指针?
out
-keyword- other asref
-keyword,根本不会使用您提供给被调用函数的值。它只是赋值不管你是否提供了一个值。因此,以下两个调用几乎相同,并且在执行myFunction
之后将为i
产生完全相同的值:
int i = 0;
myFunction(out i);
int i = 1000;
myFunction(out i);
所以在这行long x = (long)a;
a
根本没有值,这就是为什么你会得到编译器错误。为了仅仅更改传递给函数的值,您需要ref
-关键字:
static void Swap(ref int* a, ref int* b)
{
long x = (long)a; // a now has the value provided to the function
}