Ответ 1
У меня есть нижняя часть этого поведения, и это не ошибка кода контракта.
Я открыл сгенерированную сборку в ILSpy, и это код, который создается:
public Guid Id
{
get
{
Guid? guid = this.id;
if (!guid.HasValue)
{
throw new InvalidOperationException();
}
guid = this.id;
return guid.Value;
}
}
Переменная экземпляра id
копируется в локальную переменную, и эта локальная переменная reset возвращается к ее исходному значению после блока условий. Теперь стало очевидным, почему в кодовых контрактах показана ошибка, связанная с нарушением контракта, но она все же оставила меня в замешательстве, почему код был переписан в этой форме. Я сделал немного больше экспериментов и полностью выполнил кодовые контракты, и стало очевидно, что это стандартное поведение компилятора С#, но почему?
Секрет, похоже, объясняется незначительными деталями, которые я случайно пропустил из моего первоначального вопроса. Переменная экземпляра id
объявляется как readonly
, и это, по-видимому, отвечает за то, что компилятор добавляет временную переменную guid
.
Я должен признать, что я все еще запутался, почему компилятор считает, что это нужно для обеспечения гарантии неизменности для id
, но я продолжу копать...