2014-01-05 68 views
0

我有這樣的說法,它拋出我,即使數爲0斷言索引超出範圍。必須爲非負且小於集合的大小

Assert.IsTrue(list.Count==0,String.Format("It could not be opened for {0} topic, starting with {1}"list.Count,list[0])); 

我覺得很奇怪,因爲自從斷言是真的,那麼一個錯誤爲什麼該消息仍在評估中?還是我在這裏失蹤了?

回答

0

我覺得很奇怪,因爲由於斷言是真實的,那麼爲什麼仍然在評估消息呢?

因爲IsTrue是Assert類的一種方法。編譯器評估兩個參數,然後將它們傳遞給該函數。在函數被調用之前,評估第二個參數失敗。

0

IsTrue方法並沒有短路語義,如&&||。所有參數將按順序進行評估,除非其中一個引發異常

0

在調用斷言之前評估消息。這是一個發送給IsTrue方法的參數,所以之前調用string.Format。
沒有神奇的實現首先評估要聲明的表達式,然後僅在需要時才構建消息。

0

String.Format在致電Assert.IsTrue()之前執行 - 因此,如果列表爲空,則無論Assert.IsTrue()如何,都會發生錯誤。

請注意,C#中的任何函數調用都是這種情況:首先評估所有參數,然後將評估結果傳遞給該函數。

相關問題