私は C# 4.0 と Code Contracts を使用しており、独自のカスタム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:問題はこの質問に何らかの形で関連している可能性がありますか?