Sto utilizzando C# 4.0 e Contratti di codice e ho la mia personalizzata GameRoomCollection : IEnumerable<GameRoom>
.Contratti di codice, tutti numerici e personalizzati enumerabili
Desidero garantire che nessuna istanza di GameRoomCollection
contenga mai un elemento di valore null
. Non mi sembra di essere in grado di farlo, però. Invece di fare una regola generale, ho cercato di fare un semplice esempio. AllGameRooms
è un'istanza di 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
}
chiunque può vedere, il motivo per cui non l'ho provato, che non è gameRoom
null
?
EDIT:
L'aggiunta di un riferimento per l'oggetto prima iterazione non funziona neanche:
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:
Tuttavia: Se converto il tipo di raccolta sala giochi a un array, funziona perfettamente:
IGameRoom[] gameRoomArray = model.AllGameRooms.ToArray();
Contract.Assume(Contract.ForAll(gameRoomArray, g => g != null));
foreach (IGameRoom gameRoom in gameRoomArray)
SetupListeners(gameRoom);//<= NO WARNING
Ciò è dovuto al fatto che non è possibile definire una regola per i metodi dell'interfaccia IEnumerable<T>
?
EDIT3: Il problema può essere in qualche modo correlato a this question?
Sto riscontrando un problema simile quando si utilizza 'List' o' IList', piuttosto che un array. Stavo cercando di usarlo come invariante e decine di avvertenze stanno spuntando ... – Thorarin