Этот вопрос скорее из любопытства, чем из реальной проблемы. Рассмотрим следующий код (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
s нельзя установить на null
. Является ли структура автоматически преобразуемой в обнуляемый тип?