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