2013-05-11 50 views
4

我被難倒反應從CSC此代碼:C#語句可訪問性和明確賦值

{ 
    int i; 
    if (false) 
    { 
    i++;    // uninitialized, but allowed by compiler 
    } 
    if (false && i < 30) // uninitialized, but allowed by compiler 
    { 
    } 
    if (false && i < 30) // uninitialized, but allowed by compiler 
    { 
    i++;    // NOT ALLOWED by compiler?? 
    } 
} 

在這段代碼中我有三個if S和一個未初始化的局部變量我。 CSC足夠聰明,可以容忍我在第一種和第二種情況下使用我,因爲它可以告訴代碼我在哪裏使用的是無法訪問的。然而在第三種情況下,它抱怨我「使用未分配的局部變量i」的增量。爲什麼它正確地檢測到我在前兩個ifs中無法訪問的代碼中,但沒有在第三個中(這只是前兩種情況的組合)?

+1

這個問題不是真的*關於明確的分配 - 它是關於可達性的。 – 2013-05-11 18:32:26

+0

你從哪裏得到初始化? int是一個值類型,所以它被初始化爲零。 – 2013-05-11 18:35:01

+0

@TonyHopkinson我是一個局部變量,這些都不會自動爲你初始化!至於我在哪裏得到它,編譯器給了我這個錯誤! – Mishax 2013-05-11 18:38:45

回答

7

這由C#5的第8.7.1節規格:

if語句的第一個嵌入語句是可到達如果if語句是可到達的且布爾表達式不具有常數值false

即使我們可以推論,這種情況:

false && i < 30 

總是false,它不是根據語言(7.19)規則的常量表達式,因此在體內的第一個嵌入語句是可到達。

並非涉及&&的所有內容都是非假的。這是罰款,例如:

if (false && true) 
{ 
    i++; 
} 

...但因爲表達i < 30不是恆定的,你原來的表情不是恆定的。儘管我們知道表達式永遠不會被評估,但是這種情況仍然是

語言可能決定,任何&&表達,其中LHS過的false一個常量表達式也是一個常量表達式的值false,但事實並非如此。 (這隻會增加一小部分的複雜性,但好處是真的是很小)。