Я использую 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: Может ли проблема как-то быть связана с этим вопросом ?