我想知道是否有可能確保(使用code-contracts)迭代器方法永遠不會產生空項目。如何確保迭代器方法不會產生任何空項目?
這種簡化的方法:
public static IEnumerable<object> CreateSomeObjects()
{
Contract.Ensures(Contract.Result<IEnumerable<object>>() != null);
Contract.Ensures(Contract.ForAll(Contract.Result<IEnumerable<object>>(), _ => _ != null));
for (int i = 0; i < 10; ++i)
{
yield return new object();
}
}
產生編譯時間警告類似:
CodeContracts:MyClass.CreateSomeObjects()[0x9]:確保未經證實:Contract.ForAll(合同.Result>(),_ => _!= null)
我該怎麼做才能向靜態檢查器證明它?
我試圖讓這個相同的東西工作,但對我來說它甚至沒有給出任何編譯時間的警告。經過大量搜索後,我最終使用了不帶代碼合同的不同解決方案,因爲我根本無法找到解決方案。我會嘗試使用遺留代碼來檢查代碼合同塊內是否不爲null,並用'Contract.EndContractBlock()'關閉它。 https://msdn.microsoft.com/en-us/library/system.diagnostics.contracts.contract.endcontractblock(v=vs.110).aspx。讓我知道這個是否奏效! – anthonytimmers