这个问题更多是出于好奇,而不是真正的问题。考虑以下代码(如果重要,请使用C#4.0):

class Program {
  static Point myPoint = new Point(3, 5);

  static void Main(string[] args) {
    Console.WriteLine("Point Struct Before: " + myPoint);
    object point = GetPoint();
    Console.WriteLine("Point Object Before: " + point);
    myPoint.X = 10;
    Console.WriteLine("Point Struct After: " + myPoint);
    Console.WriteLine("Point Object After: " + point);
  }

  static object GetPoint() {
    return myPoint;
  }
}


输出以下内容:

Point Struct Before: 3;5
Point Object Before: 3;5
Point Struct After: 10;5
Point Object After: 3;5


现在,这可以正常工作,这意味着将复制而不是引用GetPoint()返回的点。 (否则,最后一行也将显示为“ 10; 5”。)

现在我的问题是:为什么这样做?编译器如何知道要复制还是引用对象?这是否意味着该决定是在运行时而不是编译期间完成的?

另外,这现在允许我将point设置为null,而struct不能设置为null。结构是否自动转换为可为空的类型?

最佳答案

您正在观察称为boxing的过程。它实际上将值类型转换为引用类型。

09-30 17:19
查看更多