私はこの動作の真相を突き止めましたが、これはコード コントラクトのせいではありません。
生成されたアセンブリをILSpyで開いたところ、次のコードが生成されました。
public Guid Id
{
get
{
Guid? guid = this.id;
if (!guid.HasValue)
{
throw new InvalidOperationException();
}
guid = this.id;
return guid.Value;
}
}
インスタンス変数id
はローカル変数にコピーされており、このローカル変数は条件ブロックの後で元の値にリセットされています。Code Contracts が契約違反エラーを表示する理由が明らかになりましたが、コードがこの形式で書き直された理由は依然として混乱していました。私はもう少し実験を行い、コード コントラクトをプロジェクトから完全に除外しました。これが標準的な C# コンパイラの動作であることが明らかになりましたが、なぜでしょうか?
秘密は、最初の質問から誤って省略した小さな詳細によるようです。id
インスタンス変数は as として宣言されており、これがコンパイラに一時変数 readonly
を追加させる原因となっているようです。guid
不変性の保証を確実にするためにコンパイラがこれを行う必要があると感じる理由をまだ混乱していることを認めなければなりませんが、id
掘り下げ続けます...