[英]Code contracts, forall and custom enumerable
我正在使用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:問題可能與這個問題有關嗎?
我認為這可能與GetEnumerator方法的純度有關。 PureAttribute
合同只接受定義為[Pure](無副作用)的方法。
一些額外的信息代碼合同,尋找純度
Qoute:
純度
在合同中調用的所有方法都必須是純粹的; 也就是說,他們不得更新任何先前存在的狀態。 允許純方法修改在進入pure方法后創建的對象。
代碼契約工具目前假設以下代碼元素是純粹的:
使用PureAttribute標記的方法。
使用PureAttribute標記的類型(該屬性適用於所有類型的方法)。
物業獲得訪問者。
運算符(名稱以“op”開頭,具有一個或兩個參數和非void返回類型的靜態方法)。
任何完全限定名稱以“System.Diagnostics.Contracts.Contract”,“System.String”,“System.IO.Path”或“System.Type”開頭的方法。
任何調用的委托,前提是委托類型本身與PureAttribute一起歸屬。 委托類型System.Predicate和System.Comparison被認為是純粹的。
我懷疑是因為model.AllGameRooms
返回一個IEnumerable<GameRoom>
,它可能在每個屬性訪問時都不同。
嘗試使用:
var gameRooms = mode.AllGameRooms;
Contract.Assume(Contract.ForAll(gameRooms, g => g != null));
foreach (IGameRoom gameRoom in gameRooms)
SetupListeners(gameRoom);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.