このクラスを考えると、Ensure unproven Result != null 警告が表示される理由がわかりません。
public class MyClass {
private readonly string _value;
public MyClass(string value) {
Contract.Requires(value != null);
_value = value;
}
public string Value {
get {
Contract.Ensures(Contract.Result<string>() != null);
return _value;
}
}
}
_value != null という Invariant を追加することで警告を消すことができますが、そうする必要はないように感じます。これは分析の単なる制限ですか?
編集:私の質問のポイントが見逃されていると思うので、質問にもう少し追加します。
public class Test {
private string _value = "";
public string Value {
get {
Contract.Ensures(Contract.Result<string>() != null);
return _value;
}
set {
Contract.Requires<ArgumentNullException>(value != null);
_value = value;
}
}
}
CC 分析は、このクラスに完全に満足しているようです。ctor には null 以外の値が割り当てられており、setterRequires
の null 以外の値が変更_value
されることEnsures
が証明されています。