मैं सी # 4.0 और कोड अनुबंध का उपयोग कर रहा हूं और मेरे पास अपना स्वयं का कस्टम 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: क्या समस्या किसी भी तरह this question से संबंधित हो सकती है?
मुझे सरणी के बजाय 'सूची' या 'IList' का उपयोग करते समय एक समान समस्या है। मैं इसे एक Invariant के रूप में उपयोग करने की कोशिश कर रहा था, और दर्जनों चेतावनियां पॉप अप हो रही हैं ... – Thorarin