【发布时间】:2011-06-29 11:17:13
【问题描述】:
我正在使用 C# 4.0 和代码合同,并且我有自己的自定义 GameRoomCollection : IEnumerable<GameRoom>。
我想确保GameRoomCollection 的任何实例都不会包含null 值元素。不过,我似乎无法做到这一点。我没有制定一般规则,而是尝试做一个简单明了的例子。 AllGameRooms 是 GameRoomCollection 的一个实例。
private void SetupListeners(GameRoom newGameRoom) {
Contract.Requires(newGameRoom != null);
//...
}
private void SetupListeners(Model model) {
Contract.Requires(model != null);
Contract.Requires(model.AllGameRooms != null);
Contract.Assume(Contract.ForAll(model.AllGameRooms, g => g != null));
foreach (GameRoom gameRoom in model.AllGameRooms)
SetupListeners(gameRoom);//<= Warning: Code Contracts: Requires unproven: newGameRoom != null
}
谁能看到,为什么我没有证明gameRoom 不是null?
编辑:
在迭代之前为对象添加引用也不起作用:
IEnumerable<IGameRoom> gameRooms = model.AllGameRooms;
Contract.Assume(Contract.ForAll(gameRooms, g => g != null));
foreach (IGameRoom gameRoom in gameRooms)
SetupListeners(gameRoom);//<= Warning: Code Contracts: Requires unproven: newGameRoom != null
EDIT2:
但是:如果我将游戏室集合类型转换为数组,它可以正常工作:
IGameRoom[] gameRoomArray = model.AllGameRooms.ToArray();
Contract.Assume(Contract.ForAll(gameRoomArray, g => g != null));
foreach (IGameRoom gameRoom in gameRoomArray)
SetupListeners(gameRoom);//<= NO WARNING
这是因为不能为IEnumerable<T>接口的方法定义规则造成的吗?
EDIT3:问题是否与this question有关?
【问题讨论】:
-
我在使用
List或IList而不是数组时遇到了类似的问题。我试图将它用作不变量,并且弹出了几十个警告......
标签: c# code-contracts enumerable forall