簡體   English   中英

代碼合同,forall和custom可枚舉

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM