この不変のタイプを考えてみましょう。
public class Settings
{
public string Path { get; private set; }
[ContractInvariantMethod]
private void ObjectInvariants()
{
Contract.Invariant(Path != null);
}
public Settings(string path)
{
Contract.Requires(path != null);
Path = path;
}
}
ここで注意すべき2つのこと:
Path
プロパティが決してすることができないことを保証する契約不変量がありますnull
path
コンストラクターは、引数の値をチェックして、前のコントラクト不変条件を尊重します
この時点で、Setting
インスタンスがnull
Path
プロパティを持つことはできません。
ここで、このタイプを見てください。
public class Program
{
private readonly string _path;
[ContractInvariantMethod]
private void ObjectInvariants()
{
Contract.Invariant(_path != null);
}
public Program(Settings settings)
{
Contract.Requires(settings != null);
_path = settings.Path;
} // <------ "CodeContracts: invariant unproven: _path != null"
}
_path
基本的に、静的チェック中に満たすことができない独自のコントラクト不変量(フィールド上)があります(上記のコメントを参照)。それを証明するのは簡単なので、それは私には少し奇妙に聞こえます:
settings
不変ですsettings.Path
nullにすることはできません(設定には対応するコントラクトが不変であるため)- したがって、に割り当てることにより
settings.Path
、_path
nullに_path
することはできません
私はここで何かを逃しましたか?