【发布时间】:2015-03-11 19:57:11
【问题描述】:
我的类上有一个返回 List<MyType> 的内部属性,我想使用静态检查来帮助我不在我的程序集中做任何愚蠢的事情,并可能向该集合添加一个 null。
我在属性上的 foreach 的循环变量上收到此静态警告。
警告 149 CodeContracts:可能在 null 上调用方法 参考“myLoopVariable”。你期待吗 System.Collections.Generic.List`1+Enumerator.get_Current 返回非空?
过去我的集合包含空值从来没有遇到过任何问题,但是当编译器和我不同意时,这是对的,我错了,因此我希望警告消失。这只是我之前从未想过的事情,果然MyClass.MyListProperty.Add(null)可以做到,所以确实有效。
我不能在使用循环变量的地方做Requires,因为我得到了错误:
try 块中的合约部分
它让我(没有任何错误)在方法中添加Requires:
Contract.Requires<ArgumentException>(Contract.ForAll<MyClass>(MyClassInstance.MyListProperty, x => x != null))
但是,这并没有导致原始警告消失,并且还导致了附加警告:
警告 149 CodeContracts:需要未经证实: Contract.ForAll(MyClassInstance.MyListProperty, x => x != 空)
我想知道是否有一种方法可以将该逻辑放在一个位置,靠近属性定义本身。
代码合约提供什么机制来实现这一点?
编辑:
我开始认为我将不得不再次将MyListProperty 设为私有,并限制对其的访问。否则,有人(我)可以添加null 到它! (但存在的挑战是,如何允许“受信任的”访问者进行枚举?哦,天哪!)
【问题讨论】:
-
我假设“循环变量”不在方法范围内?
-
@PeterRitchie,它在循环声明中声明。它可以在方法级别声明。你的想法是什么?
-
据我所知,
Requires位于方法的顶部... -
...但是,我认为这并不能真正解决您想要做的事情。
-
@toddmo - 我在下面提供了 3 种可能的解决方案,每一种都可以正常工作。
标签: c# code-contracts