Używam C# 4.0 i Code Contracts i mam swój własny zwyczaj GameRoomCollection : IEnumerable<GameRoom>
.Kontrakt kodu, całkowity i niestandardowy przeliczalny
Chcę się upewnić, że żadne wystąpienia z GameRoomCollection
nigdy nie zawierają elementu wartości null
. Wydaje mi się jednak, że nie jestem w stanie tego zrobić. Zamiast robić ogólną zasadę, starałem się zrobić prosty i prosty przykład. AllGameRooms
jest instancją 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
}
Czy ktoś może zobaczyć, dlaczego nie dowiodły, że gameRoom
nie jest null
?
EDIT:
Dodanie odniesienia do obiektu przed Iteracja nie działa albo:
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:
Jednakże: Jeśli przekonwertować grę typu kolekcji pokój do tablicy działa:
IGameRoom[] gameRoomArray = model.AllGameRooms.ToArray();
Contract.Assume(Contract.ForAll(gameRoomArray, g => g != null));
foreach (IGameRoom gameRoom in gameRoomArray)
SetupListeners(gameRoom);//<= NO WARNING
Jest to spowodowane tym, że nie można zdefiniować reguły dla metod interfejsu IEnumerable<T>
?
EDIT3: Czy problem może być w jakiś sposób związany z this question?
Mam podobny problem podczas używania 'List' lub' IList', zamiast tablicy. Próbowałem użyć go jako niezmiennika i pojawiały się dziesiątki ostrzeżeń ... – Thorarin