- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我不确定我是否在这里做错了什么或者是否需要修复...
我有一个自定义的 Dictionary 包装器类,这里是一段必要的代码。
public int Count
{
get
{
Contract.Ensures(Contract.Result<int>() >= 0);
return InternalDictionary.Count;
}
}
public bool ContainsKey(TKey key)
{
//This contract was suggested by the warning message, if I remove it
//I still get the same warning...
Contract.Ensures(!Contract.Result<bool>() || Count > 0);
return InternalDictionary.ContainsKey(key);
}
我为 ContainsKey 添加行的唯一原因是因为我收到以下警告消息(现在仍然如此):Codecontracts: ensures unproven: !Contract.Result<bool>() || @this.Count > 0
.我可以删除此行并仍然得到 SAME ISSUE!
我该怎么做才能摆脱这些问题?
更新:
我也试过(按照建议)...
public Boolean ContainsKey(TKey key)
{
Contract.Requires(Count == 0 || InternalDictionary.ContainsKey(key));
Contract.Ensures(!Contract.Result<bool>() || Count > 0);
return InternalDictionary.ContainsKey(key);
}
Warning 5 Method 'My.Collections.Generic.ReadOnlyDictionary
2.ContainsKey(type
2.ContainsKey(type parameter.TKey)', thus cannot add Requires.
parameter.TKey)' implements interface method
'System.Collections.Generic.IDictionary
最佳答案
“我有一个自定义的字典包装器类”——它实现了 IDictionary<TKey, TValue>
.接口(interface)方法可以指定契约,实现它们的类方法必须满足契约。在这种情况下,IDictionary<TKey, TValue>.ContainsKey(TKey)
有您询问的契约(Contract):
Contract.Ensures(!Contract.Result<bool>() || this.Count > 0);
逻辑上,!a || b
可以读作 a ===> b
( a
表示 b
),使用它,我们可以将其翻译成英文:
If ContainsKey() returns true, the dictionary must not be empty.
这是一个非常明智的要求。空字典不得声明包含键。 这是你需要证明的。
这是一个示例 DictionaryWrapper
添加 Contract.Ensures
的类 promise Count
的实现细节等于innerDictionary.Count
是其他方法可以依赖的硬保证。它添加了一个类似的 Contract.Ensures
至 ContainsKey
这样 IDictionary<TKey, TValue>.TryGetValue
契约(Contract)也是可验证的。
public class DictionaryWrapper<TKey, TValue> : IDictionary<TKey, TValue>
{
IDictionary<TKey, TValue> innerDictionary;
public DictionaryWrapper(IDictionary<TKey, TValue> innerDictionary)
{
Contract.Requires<ArgumentNullException>(innerDictionary != null);
this.innerDictionary = innerDictionary;
}
[ContractInvariantMethod]
private void Invariant()
{
Contract.Invariant(innerDictionary != null);
}
public void Add(TKey key, TValue value)
{
innerDictionary.Add(key, value);
}
public bool ContainsKey(TKey key)
{
Contract.Ensures(Contract.Result<bool>() == innerDictionary.ContainsKey(key));
return innerDictionary.ContainsKey(key);
}
public ICollection<TKey> Keys
{
get
{
return innerDictionary.Keys;
}
}
public bool Remove(TKey key)
{
return innerDictionary.Remove(key);
}
public bool TryGetValue(TKey key, out TValue value)
{
return innerDictionary.TryGetValue(key, out value);
}
public ICollection<TValue> Values
{
get
{
return innerDictionary.Values;
}
}
public TValue this[TKey key]
{
get
{
return innerDictionary[key];
}
set
{
innerDictionary[key] = value;
}
}
public void Add(KeyValuePair<TKey, TValue> item)
{
innerDictionary.Add(item);
}
public void Clear()
{
innerDictionary.Clear();
}
public bool Contains(KeyValuePair<TKey, TValue> item)
{
return innerDictionary.Contains(item);
}
public void CopyTo(KeyValuePair<TKey, TValue>[] array, int arrayIndex)
{
innerDictionary.CopyTo(array, arrayIndex);
}
public int Count
{
get
{
Contract.Ensures(Contract.Result<int>() == innerDictionary.Count);
return innerDictionary.Count;
}
}
public bool IsReadOnly
{
get
{
return innerDictionary.IsReadOnly;
}
}
public bool Remove(KeyValuePair<TKey, TValue> item)
{
return innerDictionary.Remove(item);
}
public IEnumerator<KeyValuePair<TKey, TValue>> GetEnumerator()
{
return innerDictionary.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return innerDictionary.GetEnumerator();
}
}
关于c# - 代码契约(Contract) : Ensures Unproven & Requires Unproven,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7419134/
我不确定我是否在这里做错了什么或者是否需要修复... 我有一个自定义的 Dictionary 包装器类,这里是一段必要的代码。 public int Count { get {
尽管 _foo 不可能为 null,但下面的简单代码将由代码契约的静态检查器产生“不变的未经证实”的警告。该警告针对 UncalledMethod 中的 return 语句。 public class
我不明白这条消息想告诉我什么: CodeContracts: invariant unproven: _uiRoot != null && _uiRoot.Children != null && _u
在阅读了对此类问题的其他一些回答后,我仍然留下了警告。在这个片段中,我从我的数据库中提取了一个 UserActivation。至此,总会有至少一个 UserActivation。如果有更多的东西已经变
下面是一个非常简单的例子。当我打开静态分析警告时,我仍然得到警告 CodeContracts:确保未经证实:Contract.Result() != string.Empty 在线 return st
我刚开始在我的项目中使用代码契约。但是,我的存储库实现有问题,它使用 Entity Framework 查询我的数据库。 我有以下方法: public IEnumerable GetAllOrgani
当 C# CodeContracts 时,我有几种报告警告的方法“代码契约(Contract):需要未经证实的:构造函数!= null”静态检查器已启用。 这些特定方法不声明任何契约,也不会被任何声明
我正在寻找一种简单的方法来强制执行 INotifyPropertyChanged 的正确实现,即当 PropertyChanged 被引发时,它必须引用实际定义的属性。我尝试使用 Microsof
我正在尝试使用以下示例了解 .NET 代码契约如何与 lock 关键字交互: public class TestClass { private object o1 = new object();
我有以下界面: [ContractClass(typeof(MyObjectContract))] public interface IMyObject { int CountOfItems
我的代码看起来像这样: public class Foo : ObservableCollection { private T bar; public Foo(IEnumerable
我是一名优秀的程序员,十分优秀!