2013-03-23 60 views
0

這是我的理解,C#條件操作執行短路。但是,我的程序在運行此代碼時會引發異常。索引等於-1,所以第二個條件應該永遠不會執行,但是我得到一個索引越界異常。短路不工作

if (index != -1 || pieces[index].Type != PieceType.Rook) 
{ 
    allowed = false; 
} 
+1

你想&&,not || (如果(第一個條件AND第二個條件) – 2013-03-23 15:17:14

回答

2

您已使用||因此,當第一個條件失敗時(索引IS -1),運行時需要檢查第二個條件,然後排除執行代碼,並且會觸發異常,如果您希望使用只有當這兩個條件爲真時才輸入if。
這樣,和以前一樣,運行時檢查第一個條件,現在得到錯誤結果,就足以決定沒有必要檢查第二個條件..

if (index != -1 && pieces[index].Type != PieceType.Rook) 
{ 
    allowed = false; 
} 
+0

這是行不通的,因爲那樣它總會給出一個索引超出範圍。數組不是從-1開始。 – Emrys90 2013-03-23 15:20:21

+0

@ Emrys90,我認爲你需要刷新那些基礎知識。說'如果(索引不等於-1和在索引IS不是白嘴鴉)'如果索引*是* -1,它會短路並且不檢查第二面,整體表達式已經是假的 – 2013-03-23 15:21:03

+0

這就是我希望它能夠執行if的主體,如果索引不是-1並且元素不是Rook,如果索引是-1,我希望它跳過語句 – Emrys90 2013-03-23 15:25:28

0

這是因爲您使用OR運算符。第一個條件是錯誤的,所以第二個條件開始評估

0

您應該擁有index != 1 && ...

另外,是index< -1>= pieces.Length

1

更換||&&

if (index != -1 && pieces[index].Type != PieceType.Rook) 

否則第二codition進行評估,如果第一個是假的,你不想要的東西。你希望兩個條件都是true,尤其是第一個。

0

||將停止評估它的時候發現事情是真的。由於index != -1是錯誤的,它會評估表達式的兩邊。如果你&&一旦發現錯誤就會停止。我會推薦在lazy evulation上閱讀。