我有這樣的說法,它拋出我,即使數爲0斷言索引超出範圍。必須爲非負且小於集合的大小
Assert.IsTrue(list.Count==0,String.Format("It could not be opened for {0} topic, starting with {1}"list.Count,list[0]));
我覺得很奇怪,因爲自從斷言是真的,那麼一個錯誤爲什麼該消息仍在評估中?還是我在這裏失蹤了?
我有這樣的說法,它拋出我,即使數爲0斷言索引超出範圍。必須爲非負且小於集合的大小
Assert.IsTrue(list.Count==0,String.Format("It could not be opened for {0} topic, starting with {1}"list.Count,list[0]));
我覺得很奇怪,因爲自從斷言是真的,那麼一個錯誤爲什麼該消息仍在評估中?還是我在這裏失蹤了?
我覺得很奇怪,因爲由於斷言是真實的,那麼爲什麼仍然在評估消息呢?
因爲IsTrue
是Assert類的一種方法。編譯器評估兩個參數,然後將它們傳遞給該函數。在函數被調用之前,評估第二個參數失敗。
IsTrue
方法並沒有短路語義,如&&
或||
。所有參數將按順序進行評估,除非其中一個引發異常
在調用斷言之前評估消息。這是一個發送給IsTrue方法的參數,所以之前調用string.Format。
沒有神奇的實現首先評估要聲明的表達式,然後僅在需要時才構建消息。
String.Format
在致電Assert.IsTrue()
之前執行 - 因此,如果列表爲空,則無論Assert.IsTrue()
如何,都會發生錯誤。
請注意,C#中的任何函數調用都是這種情況:首先評估所有參數,然後將評估結果傳遞給該函數。