C# 拳击比赛赢了';不能将其转换为引用类型吗?

C# 拳击比赛赢了';不能将其转换为引用类型吗?,c#,.net,C#,.net,纠正我,如果我把值类型转换成引用类型是错误的,那么为什么下面的代码给出10个输出而不是12个 public static void fun(Object obj) { obj =12; } static void Main(string[] args) { int value =10; Object obj = value; fun(obj); Console.WriteLine((i

纠正我,如果我把值类型转换成引用类型是错误的,那么为什么下面的代码给出10个输出而不是12个

public static void fun(Object obj)
    {
        obj =12;
    }
    static void Main(string[] args)
    {
        int value =10;
        Object obj = value;
        fun(obj);
        Console.WriteLine((int)obj);
    }

这与装箱/拆箱无关。您只需在方法中创建一个新对象,并用它替换传递的参数。由于未将then参数作为
ref
传递,因此调用代码不受影响

将您的方法声明为

public static void fun(ref Object obj)
把电话改成

fun(ref obj);

然后它将输出12。

.NET函数调用按值传递参数,而不是按引用传递参数(使用
ref
out
时除外)。也就是说,一旦你在函数内部为函数的参数赋值,你就看不到函数外部的变化。即使对于引用类型,您可以传递引用,但仍然可以按值传递这些引用。

因为您将值作为值类型传递给函数。您应该将对象作为引用类型传递

public static void Main(string[] args)
{
   int value =10;
   Object obj = value;
   fun(ref obj);
   Console.WriteLine((int)obj);
}

public static void fun(ref Object obj)
{
    obj =12;
}

因为调用
fun
时,实际上并没有修改
Main
方法中
obj
的值。该值被赋予
fun
并在那里更改,因为它本质上是该变量的副本,因为它是通过值传递的,而不是通过引用传递的

使用
ref
关键字:

public static void fun(ref Object obj)
{
   obj = 12;
}
static void Main(string[] args)
{
   int value = 10;
   Object obj = value;
   fun(ref obj);
   Console.WriteLine((int)obj);
}
或者使您的
方法有趣
返回新值:

public static Object fun(Object obj)
{
   obj = 12;
   return obj;
}
static void Main(string[] args)
{
   int value = 10;
   Object obj = value;
   obj = fun(obj);
   Console.WriteLine((int)obj);
}

它的值类型或引用类型无关紧要。
将变量传递给函数时,就是在函数中用变量指定参数。它们都指向同一个实例。但在函数内部,您正在为它指定一个新值,因此它是一个新实例。前一个当然不会改变

这与:

object o = 10;
object o2 = o;
o2=12;

o
仍然是10,而
o2
是12

你试过运行它吗?是的,它给出10个输出,当然它返回10。将参数传递给方法时,该方法会“复制”该参数。因此,原始的
obj
仍保持不变。但是
fun
方法中的一个将被更改。这个参数copy thingy被称为“passby value”。如果不希望发生这种情况,请检查“按引用传递”,如果要传递引用,则需要使用
ref
关键字(更改对象本身而不是其副本)@Nofi对引用类型尝试相同的方法,您将得到相同的结果如果我们甚至可以通过添加ref将值类型作为引用传递,那么为什么我们有两种不同的变量类型(值类型和ref类型)?因为当您将变量传递给另一个使用它的方法时,您可能不一定要更改变量的值。我们必须将ref关键字与值类型和引用类型一起使用,以便将它们作为引用传递,所以我们为什么不只使用引用类型,因为如果不使用ref关键字,它将作为值类型。