ref t的确是t的内存地址。
static void Main(string[] args) 

    int t = 100;                      // t:栈。因为t是值类型
    f(ref  t);                        // ref t:即不是栈也不是堆,而是寄存器。因为CLR的默认函数调用规则是fastcall。
    Console.WriteLine(t); 
} public static void f(ref int tt) 

    tt = 10;                          // 往ref tt指定的内存地址写入常数10,该内存地址就是Main中int t在栈中位置。

解决方案 »

  1.   

    tt=10,
    把10写入tt指定的内存地址
      

  2.   

    public static void f(ref int tt) 
            { 
                tt = 10; //对t地址内的值操作
            } 
            static void Main(string[] args) 
            { 
                int t = 100; // 声明一个int类型变量(值类型),在栈上分配一块内存存储
                f(ref  t); //引用传参,这传进去的是t的地址,这里的变量t不发生拷贝,直接对原来声明的t操作
                Console.WriteLine(t); //所以输出的为10
            } 
    public static void f(int tt) 
            { 
                tt = 10; //对t地址内的值操作
            } 
            static void Main(string[] args) 
            { 
                int t = 100; // 声明一个int类型变量(值类型),在栈上分配一块内存存储
                f(t); //值传参,这传进去的是t副本,在这里t发生了一个拷贝,对t的副本进行操作,t的副本改变,并没有影响到t本身的值
                Console.WriteLine(t);//所以输出的是100
            } 
      

  3.   

    public static void f(ref int tt) 
            { 
                tt = 10; //对t地址内的值操作 
            } 
            static void Main(string[] args) 
            { 
                int t = 100; // 声明一个int类型变量(值类型),在栈上分配一块内存存储 
                f(ref  t); //引用传参,这传进去的是t的地址,这里的变量t不发生拷贝,直接对原来声明的t操作 
                Console.WriteLine(t); //所以输出的为10 
            } 
    public static void f(int tt) 
            { 
                tt = 10; //对t的副本操作,这儿写错了 
            } 
            static void Main(string[] args) 
            { 
                int t = 100; // 声明一个int类型变量(值类型),在栈上分配一块内存存储 
                f(t); //值传参,这传进去的是t副本,在这里t发生了一个拷贝,对t的副本进行操作,t的副本改变,并没有影响到t本身的值 
                Console.WriteLine(t);//所以输出的是100 
            }