Estoy usando C# 4.0 y Contratos de código y tengo mi propio GameRoomCollection : IEnumerable<GameRoom>
personalizado.Contratos de código, forall y enumerable personalizado
Quiero asegurarme de que ninguna instancia de GameRoomCollection
contendrá un elemento de valor null
. No obstante, no consigo hacerlo. En lugar de hacer una regla general, he intentado hacer un ejemplo claro y simple. El AllGameRooms
es una instancia de 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
}
¿Alguien puede ver, por qué no he demostrado, que no es gameRoom
null
?
EDIT:
Adición de una referencia para el objeto antes de la iteración no funciona bien:
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:
Sin embargo: Cuando se modifica el tipo de colección sala de juegos a una matriz, funciona bien:
IGameRoom[] gameRoomArray = model.AllGameRooms.ToArray();
Contract.Assume(Contract.ForAll(gameRoomArray, g => g != null));
foreach (IGameRoom gameRoom in gameRoomArray)
SetupListeners(gameRoom);//<= NO WARNING
¿Esto se debe al hecho de que no se puede definir una regla para los métodos de la interfaz IEnumerable<T>
?
EDIT3: ¿Puede el problema de alguna manera estar relacionado con this question?
Tengo un problema similar cuando uso 'List' o' IList', en lugar de una matriz. Intenté usarlo como Invariante, y aparecen docenas de advertencias ... – Thorarin