Я продолжаю изучать С# и спецификацию языка. И вот другое поведение, которое я не совсем понимаю:
Спецификация языка С# четко заявляет следующее в разделе 10.4:
Тип, указанный в объявлении константы, должен быть sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double, decimal, bool, string, enum-type или reference -типа.
В разделе 4.1.4 также указано следующее:
Через объявления const можно объявить константы простых типов (§10.4). Невозможно иметь константы других типов структур, но аналогичный эффект обеспечивается статическими полями readonly.
Итак, аналогичный эффект можно получить, используя статический readonly. Прочитав это, я пошел и попробовал следующий код:
static void Main()
{
OffsetPoints();
Console.Write("Hit a key to exit...");
Console.ReadKey();
}
static Point staticPoint = new Point(0, 0);
static readonly Point staticReadOnlyPoint = new Point(0, 0);
public static void OffsetPoints()
{
PrintOutPoints();
staticPoint.Offset(1, 1);
staticReadOnlyPoint.Offset(1, 1);
Console.WriteLine("Offsetting...");
Console.WriteLine();
PrintOutPoints();
}
static void PrintOutPoints()
{
Console.WriteLine("Static Point: X={0};Y={1}", staticPoint.X, staticPoint.Y);
Console.WriteLine("Static readonly Point: X={0};Y={1}", staticReadOnlyPoint.X, staticReadOnlyPoint.Y);
Console.WriteLine();
}
Вывод этого кода:
Статическая точка: X = 0; Y = 0
Статическая точка readonly: X = 0; Y = 0
Взаимозачет...
Статическая точка: X = 1; Y = 1
Статическая точка readonly: X = 0; Y = 0
Нажмите клавишу для выхода...
Я действительно ожидал, что компилятор даст мне какое-то предупреждение об изменении статического поля readonly или сбое в этом, чтобы изменить поле, как это было бы со ссылочным типом.
Я знаю, что изменяемые типы значений являются злыми (почему Microsoft когда-либо реализовала Point
, поскольку mutable является загадкой), но не должен ли компилятор предупреждать вас каким-то образом о том, что вы пытаетесь изменить статический тип значения readonly? Или, по крайней мере, предупредите, что ваш метод Offset()
не будет иметь "желаемых" побочных эффектов?